Xor Warum kommt Flasches Zeichen in Java

Status
Nicht offen für weitere Antworten.

nitschchedu

Mitglied
Hallo ich mache wie im PHP nun im Java Xor.

Nun kommt es vor das im Java manche Zeichen nicht so wie im PHP richtig rauskommen.
Dabei habe ich hier ein Zeichen gefunden bei dem das so ist:

Code:
char test = HexString.hexToString("8a").charAt(0);
        test ^= HexString.hexToString("EF").charAt(0);

        System.out.println(test);

Rauskommen müsste wie im PHP ein
das tut es aber nicht .... was mache ich Falsch ?
 

Marco13

Top Contributor
Die Klasse 'HexString' kenne ich zwar nicht, aber ... du rechnest da vermutlich mit Zeichen (chars) und nicht mit Werten...

char test = HexString.hexToString("8a").charAt(0); // test is jetzt vermutlich das ZEICHEN '8', und hat darum den Wert 56
 

nitschchedu

Mitglied
Also auf Test steht bei mir 96 ... nicht richtig ?

Sehe gerade das meine Klasse Bugi ist ... hast du eine Idee wie ich Hex zu Char mache ?
 

0x7F800000

Top Contributor
ich würde eher drauf tippen, dass da '1' aus 138 mit der '2' aus 239 mit XOR verrechnet wird, was sicherlich nicht 'e' ergibt, weil '1' und '2' sich gerade mal in den zwei ersten Bits unterscheidet, es kommt also dem 3. char entspricht, was irgendein Zeichen ist, das ich auf der eclipse-console nicht lesen kann.

Aber was soll dieser ganze Kram mit HexString usw? Hab nicht mal unter den ersten 10 Google-Treffern was gefunden, was soll das sein, wo kommt das her?

=> IMMER KLEINES KOMPILIERBARES BEISPIEL BASTELN!!!
 

0x7F800000

Top Contributor
nitschchedu hat gesagt.:
hast du eine Idee wie ich Hex zu Char mache ?
hmmm, merkwürdig... mir fällt nichts besseres als
Code:
char t=(char)Integer.parseInt("EF", 0x10);
ein.

Kannst du die Hex-Werte nicht direkt eintippen? etwa:
Code:
char c=0xEF;
 

nitschchedu

Mitglied
ne die kommen aus einen String der sich jedesmal ändert ^^

Ist das so nicht besser ?
Code:
char t=(char)Integer.parseInt("EF", 16);

Basis ist ja 16 bei Hex ^^ ! ?

@obwohl ist das selbe wenn ich mir das mal anschaue ^^
 

0x7F800000

Top Contributor
du willst text zeichen für zeichen in hexadezimaldarstellungen von einzelnen zeichen übersetzen? wozu soll sowas gut sein?
Aber naja, deine Sache...
Code:
	public static String demolateString(String text){
		StringBuilder builder=new StringBuilder(text.length()*2);
		for(int i=0; i<text.length(); builder.append(Integer.toHexString(text.charAt(i))), i++);
		return builder.toString();
	}
 

nitschchedu

Mitglied
Wie kann es sein das bei Hex 160 bei deiner Funktion rauskommt ? Wenn HexChars doch nur bis FF gehen !?
Java veralbert mich :?

@Anscheinend liegt es an charAt das gibt mir falsche Zeichen zurück oO
 

0x7F800000

Top Contributor
aaachhhhh, dann muss man das ebn noch die breite auf 2 zeichen festsetzen, dass da alles mit nullen aufgefüllt wird:
Code:
	public static String demolishString(String text){
		StringWriter writer=new StringWriter(text.length()*2);
		PrintWriter printer=new PrintWriter(writer);
		for(int i=0; i<text.length(); printer.printf("%02X", (int)text.charAt(i)), i++);
		return writer.getBuffer().toString();
	}
dann bekommt man bei sowas:
Code:
String s=""+(char)0x00+(char)0xFF+(char)0x45+(char)0x65;
	System.out.println(s+"\t"+demolishString(s));
wieder genau 00FF4565 zurück. Ist das was du haben wolltest? ???:L

ansonsten könntest du wenigstens mal angeben bei welchem string "160" auskommen soll.
vielleicht ist das die korrekte hexadezimal darstellung für ein char, das außerhalb von ascii ist, und daher nicht auf zwei hexadezimalstellen passt. Bist du dir sicher, dass du nur mit ascii zeichen herumhantierst?
 
S

Spacerat

Gast
Huch... das kenn' ich doch...

@hdi: Was hat denn wohl dein Link mit diesem Thema zu tun? Willst du uns etwa so mitteilen, dass PHP Äpfel und Birnen zusammenzählt oder fehlt da nur der Name zum Zitat?

@PHP: (ehrlich... ich mein die Sprache... :) ) Wie kommt man eigentlich dazu, Datentypen so dermassen zusammenzuwürfeln, das sogar Zeichenketten zusammengerechnet werden? Ach ja... zum verknüpfen gibts ja den Punkt... hua, hua, hua... absolut 'TYPESAFE'... ehrlich...

Nee... mal ernsthaft... das ist genau das, worüber man stolpert, wenn man PHP-Anwendungen in Sprachen wie z.B. Java konvertieren will. PHP 'rechnet' mit Strings! "1234" + "5678" macht in PHP "6912" und in Java "12345678". Na merkt er was? Während die HexStrings in PHP schlicht als Zahlen interpretiert werden, muss man in Java einen recht weiten Umweg gehen. Fakt ist, das (char) '1' z.B. in Java nicht 1 sondern 49 (0x31) ergibt. Das falsche Zeichen kommt also wohl eher in PHP.

Sagte ich Eingangs das kommt mir bekannt vor? Hier meine Lösung des Problems...

Code:
public final class HexMath
{
  private static final String NUMBERS = "0123456789abcdefABCDEF";
  private static final int RADIX = 0x10; // Basis 16

  public static class MD5String
  extends HexString
  {
    private static final long serialVersionUID = 8423109029732380666L;

    public MD5String(String value)
    {
      super((value != null && value.length() >= 32)? value.substring(value.length() - 32) : "");
    }
  }

  public static class HexString
  extends Number
  implements Cloneable
  {
    private static final long serialVersionUID = 6216050881224903751L;
    private final String value;

    public HexString(long value)
    {
      this(Long.valueOf(value).toString());
    }

    public HexString(double value)
    {
      this(Double.doubleToLongBits(value));
    }

    public HexString(float value)
    {
      this(Float.floatToIntBits(value));
    }

    public HexString(String value)
    {
      if(!check(value)) throw new NumberFormatException("illegal value" + value);
      this.value = value;
    }

    private boolean check(String value)
    {
      if(value == null || value.length() == 0) return false;
      boolean rc = true;
      for(int n = 0; n < value.length() && rc; n++) rc &= NUMBERS.contains(String.valueOf(value.charAt(n)));
      return rc;
    }

    public HexString expand(int times)
    {
      return expand(times, true);
    }

    public HexString expand(int times, boolean ignorenflag)
    {
      if(times < 1) throw new IllegalArgumentException("parameter 'times' has to be larger than 0");
      StringBuffer tmp = new StringBuffer();
      int flag = (!ignorenflag)? Integer.parseInt(String.valueOf(value.charAt(0)), RADIX) : 0;
      tmp.append(NUMBERS.charAt(((flag & RADIX) != 0)? 8 : 0));
      times--;
      for(; times > 0; times--) tmp.append(NUMBERS.charAt(0));
      if(!ignorenflag) {
        tmp.append(NUMBERS.charAt(flag | (RADIX - 1)));
        flag = 1;
      }
      tmp.append(value.substring(flag));
      return new HexString(tmp.toString());
    }

    public static HexString parseHex(String value)
    {
      return new HexString(value);
    }

    public static HexString parseHex(double value)
    {
      return new HexString(value);
    }

    public static HexString parseHex(float value)
    {
      return new HexString(value);
    }

    public static HexString parseHex(long value)
    {
      return new HexString(value);
    }

    public final double doubleValue()
    {
      return Double.longBitsToDouble(longValue());
    }

    public final float floatValue()
    {
      return Float.intBitsToFloat(intValue());
    }

    public final int intValue()
    {
      int start = (value.length() > 8)? value.length() - 8 : 0;
      return Integer.parseInt(value.substring(start), 16);
    }

    public final long longValue()
    {
      int start = (value.length() > 16)? value.length() - 16 : 0;
      return Long.parseLong(value.substring(start), 16);
    }

    public final String toString()
    {
      return value;
    }

    public final int length()
    {
      return value.length();
    }

    public final Object clone()
    {
      return new HexString(value);
    }

    public final boolean equals(Object obj)
    {
      if(this == obj) return true;
      try {
        HexString tmp = (HexString) obj;
        return tmp.value.equalsIgnoreCase(value);
      } catch(ClassCastException e) {
        return false;
      }
    }
  }

  private HexMath()
  {
  }

  public static HexString xor(HexString a, HexString b)
  {
    return eor(a, b);
  }

  public static HexString eor(HexString a, HexString b)
  {
    if(a == null || b == null) throw new NullPointerException();
    int length = Math.max(a.length(), b.length());
    if(a.length() < length) a = a.expand(length - a.length());
    if(b.length() < length) b = b.expand(length - b.length());
    StringBuffer rc = new StringBuffer();
    int tmp;
    for(int i = 0; i < a.length(); i++) {
      tmp = Integer.parseInt(String.valueOf(a.value.charAt(i)), RADIX)
          ^ Integer.parseInt(String.valueOf(b.value.charAt(i)), RADIX);
      rc.append(NUMBERS.charAt(tmp));
    }
    return new HexString(rc.toString());
  }

  public static HexString and(HexString a, HexString b)
  {
    if(a == null || b == null) throw new NullPointerException();
    int length = Math.max(a.length(), b.length());
    if(a.length() < length) a = a.expand(length - a.length());
    if(b.length() < length) b = b.expand(length - b.length());
    StringBuffer rc = new StringBuffer();
    int tmp;
    for(int i = 0; i < a.length(); i++) {
      tmp = Integer.parseInt(String.valueOf(a.value.charAt(i)), RADIX)
          & Integer.parseInt(String.valueOf(b.value.charAt(i)), RADIX);
      rc.append(NUMBERS.charAt(tmp));
    }
    return new HexString(rc.toString());
  }

  public static HexString or(HexString a, HexString b)
  {
    if(a == null || b == null) throw new NullPointerException();
    int length = Math.max(a.length(), b.length());
    if(a.length() < length) a = a.expand(length - a.length());
    if(b.length() < length) b = b.expand(length - b.length());
    StringBuffer rc = new StringBuffer();
    int tmp;
    for(int i = 0; i < a.length(); i++) {
      tmp = Integer.parseInt(String.valueOf(a.value.charAt(i)), RADIX)
          | Integer.parseInt(String.valueOf(b.value.charAt(i)), RADIX);
      rc.append(NUMBERS.charAt(tmp));
    }
    return new HexString(rc.toString());
  }

  public static HexString eand(HexString a, HexString b)
  {
    return xand(a, b);
  }

  public static HexString xand(HexString a, HexString b)
  {
    a = eor(a, b);
    return not(a);
  }

  public static HexString nor(HexString a, HexString b)
  {
    a = or(a, b);
    return not(a);
  }

  public static HexString nand(HexString a, HexString b)
  {
    a = and(a, b);
    return not(a);
  }

  public static HexString not(HexString a)
  {
    if(a == null) throw new NullPointerException();
    StringBuffer tmp = new StringBuffer();
    int cnt = 0;
    while(cnt++ < a.length()) tmp.append("f");
    return eor(a, new HexString(tmp.toString()));
  }
}
Diese Implementation kann beliebig lange HexStrings 'or', 'and', 'nor', 'nand', 'xor' und 'xand' verknüpfen. Dazu dürfen die HexStrings auch verschiedene Längen haben. 'not' stellt eine 'xor'-Verknüpfung eines HexStrings mit einem mit "f"s gefüllten HexString gleicher Länge dar. 'eor' und 'eand' sind andere Bezeichnungen für 'xor' und 'xand'.

mfg Spacerat
 

nitschchedu

Mitglied
Ich möchte noch auf Bezug zu PHP klar stellen das ich das da richtig umrechne ;)

Code:
public function StrToHex($string)
		{
		    $hex="";
		    
		    for ($i=0;$i<strlen($string);$i++)
		    {
		        $hex.=(strlen(dechex(ord($string[$i])))<2)? "0".dechex(ord($string[$i])): dechex(ord($string[$i]));
		    }
		    
		    return $hex;
		}

Aber danke für die Klasse ich Probiere es aus ;)
 
S

Spacerat

Gast
Upsi... Da ist mir doch glatt noch ein Druckfehler in der Klasse aufgefallen... (erst jetzt, wo ich den Quelltext noch mal sehe...)
Und zwar die funktion "ead" sollte "eand" heissen. Ich selbst verwende "xand", deswegen fiel es wohl noch nicht auf.
Was solls... Sooowichtig ist das nun auch nicht. Aber ich verbesser das mal...
Ansonsten verwende ich das ganze schon länger und hatte bisher noch keine Probleme.

mfg Spacerat

@Edit: Ok Ok Ok... Der Quelltext war im Allgemeinen etwas älter... Da fehlt z.B. noch ein Postinkrement bei "not" und die "expand"-Methode tickte auch noch nicht richtig. Hab' mal alles durchgetestet. Jetzt funzt alles wie es sollte.
 

nitschchedu

Mitglied
Wie sollen das gehen oO ?

Code:
 HexString hex = HexString.parseHex(hexString);
return hex.toString();

Wäre echt toll wenn du mir mal die jeweilige Richtung erläutern könntest !
 
S

Spacerat

Gast
Mit ein bissl Code...
Code:
Integer integer = Integer.parseInt(IntString);
return integer.toString();
Das ist genauso, bis auf die Gewähleistung, das die Strings wirklich Integer-Werte oder in unserem Fall HexStrings sind, wenig Sinnvoll. Sinn macht es erst, wenn man mit den HexStrings, wie auch mit den Integern, rechnet. In dieser beziehung denke ich gerade noch über weitere Methoden nach. Z.B. "add", "sub", "divide" und "multiply", weil ich trotz Verwendung der SuperKlasse "Number" die dafür definierten zeichen nicht verwenden kann.

mfg Spacerat
 

nitschchedu

Mitglied
Ach so verstehe. Dann sehe ich dafür bei meinen beispiel keine Verwendung.

Was ich will ist:
(String)Test => (String)1D2C3464
und
(String)1D2C3464 => (String)Test
 
S

Spacerat

Gast
Huh... ach so... ist ne Idee das zu implementieren...

mfg Spacerat
 

0x7F800000

Top Contributor
nitschchedu hat gesagt.:
Was ich will ist:
(String)Test => (String)1D2C3464
und
(String)1D2C3464 => (String)Test
Dann verstehe ich leider immer noch nicht, was du willst.
Wenn man buchstaben aus "Test" durch jeweils 2-Stellige Hexadezimalzahl darstellt, dann kommt da "54657374" raus, und nicht "1D2C3464", es sei denn, man verschiebt das irgendwie.... ???:L
 
S

Spacerat

Gast
Sooo... wie wär's damit?
Code:
  public static HexString fromCharSequence(CharSequence value)
  {
    if(value == null || value.length() == 0) throw new IllegalArgumentException("'value' may not be empty or 'null'");
    StringBuffer tmp = new StringBuffer();
    for(int i = 0; i < value.length(); i++) {
      tmp.append(Integer.toHexString(value.charAt(i)));
    }
    return new HexString(tmp.toString());
  }

  public final String toCharSequence()
  {
    String tmp = value;
    char add;
    if(tmp.length() % 2 != 0) tmp = "0" + tmp;
    StringBuffer rc = new StringBuffer();
    for(int i = 0; i < tmp.length() - 1; i += 2) {
      add = (char) Integer.parseInt(tmp.substring(i, i + 2), RADIX);
      rc.append(add);
    }
    return rc.toString();
  }
Ach so... das sind Methoden der Klasse HexString (wer hätte das gedacht? :) ) und müssen natürlich dort eingefügt werden (hätte man 'nu ooch nich' jewusst :) ).

mfg Spacerat
 

0x7F800000

Top Contributor
macht das irgendwas anderes, als der code den ich auf der ersten Seite gepostet hab?
Code:
    public static boolean isTwoHexDigitsEncodable(String s){
		for(int i=0; i<s.length(); i++){
			if(s.charAt(i)>(char)0xFF){
				return false;
			}
		}
		return true;
	}
	public static String toHexString(String text){
		StringBuilder builder=new StringBuilder(text.length()*2);
		char c;
		for(int i=0; i<text.length(); i++){
			builder.append( ((c=text.charAt(i))<(char)0x10?"0":"")+Integer.toHexString(c));
		}
		return builder.toString();
	}
	public static String fromHexString(String hex){
		StringBuilder b=new StringBuilder(hex.length()/2);
		for(int i=0; i<hex.length(); i+=2){
			b.append((char)(Integer.parseInt(hex.substring(i,i+2),16)));
		}
		return b.toString();	
	}

Korrigiert am 4.1.2009, besten Dank an OP

so, das wäre mein vorschlag nochmal, auch mit der umkehrfunktion.[/b]
 
S

Spacerat

Gast
@Andrey: Nee, nicht wirklich, bis auf Speichermehrbedarf wegen Printer.printf(). Ging es eingangs nicht auch mehr um die Antivalenz (Exklusiv-Oder) zweier HexStrings? Deswegen hatte ich ja mal den Quelltext einer Klasse rausgekramt (wenn auch nicht den aktuellsten), die ich schon seit Monaten oder sogar Jahren verwende. Gut... die beiden Methoden die "nietschedu" noch haben wollte gab's bei mir noch nicht, und deine schien mir aus den ogG verbesserungswürdig. Sorry.

mfg Spacerat
 

0x7F800000

Top Contributor
Speichermehrbedarf wegen Printer.printf()
ja, bei solchen banalen sachen sollte man in der tat lieber manuell die 0 drankleben, den PrintWriter nehm ich mal wieder aus dem code raus, da hast du schon recht :toll:
Ging es eingangs nicht auch mehr um die Antivalenz (Exklusiv-Oder) zweier HexStrings? Deswegen hatte ich ja mal den Quelltext einer Klasse rausgekramt (wenn auch nicht den aktuellsten), die ich schon seit Monaten oder sogar Jahren verwende.
ich weiß es nicht mehr, weil der OP das anscheinend selbst nicht mehr weiß ;)
 

nitschchedu

Mitglied
Andrey hat gesagt.:
nitschchedu hat gesagt.:
Was ich will ist:
(String)Test => (String)1D2C3464
und
(String)1D2C3464 => (String)Test
Dann verstehe ich leider immer noch nicht, was du willst.
Wenn man buchstaben aus "Test" durch jeweils 2-Stellige Hexadezimalzahl darstellt, dann kommt da "54657374" raus, und nicht "1D2C3464", es sei denn, man verschiebt das irgendwie.... ???:L

Das war nur Beispiel Hex ... keine Ahnung was das ergibt ..... sollte nur Demonstrieren wie ich es gerne umwandeln würde.


Dann bedanke ich mich an dieser stelle mal und Probiere wieder alles aus ;)


@Test

Zu

Andrey hat gesagt.:
macht das irgendwas anderes, als der code den ich auf der ersten Seite gepostet hab?
Code:
    public static boolean isTwoHexDigitsEncodable(String s){
		for(int i=0; i<s.length(); i++){
			if(s.charAt(i)>(char)0xFF){
				return false;
			}
		}
		return true;
	}
	public static String toHexString(String text){
		StringBuilder builder=new StringBuilder(text.length()*2);
		char c;
		for(int i=0; i<text.length(); i++){
			builder.append( ((c=text.charAt(i))<(char)0x10?"0":"")+Integer.toHexString(c));
		}
		return builder.toString();
	}
	public static String fromHexString(String hex){
		StringBuilder b=new StringBuilder(hex.length()/2);
		String digits="0123456789ABCDEF";
		for(int i=0; i<hex.length(); i+=2){
			b.append((char)(digits.indexOf(hex.charAt(i))*0x10+digits.indexOf(hex.charAt(i+1))));
		}
		return b.toString();	
	}
so, das wäre mein vorschlag nochmal, auch mit der umkehrfunktion.

kommt folgendes raus ???:L

cool mama
636f6f6c206d616d61
c___ _a_a



@Patch

Hehe hab was gepatch das geht :D

Code:
public static String fromHexString(String hex)
   {
      StringBuilder b=new StringBuilder(hex.length()/2);

      for(int i=0; i<hex.length(); i+=2)
      {
         b.append((char)Integer.parseInt(hex.substring(i, i+2) , 16));
      }

      return b.toString();
   }
 

0x7F800000

Top Contributor
ooh man :shock:
Da hast du mich erwischt. Mein code liefert manchmal tatsächlich den totalen shice, hab "Test" unglücklich gewählt, da kam irgendwas richtiges raus, sorry :oops:
 

nitschchedu

Mitglied
So um wieder zum Xor zukommen woran kann es liegen das trotzdem bei jeder 4 stelle ein Falsches zeichen steht oO ? Und im PHP nicht.

Code:
 public String Crypt(String buff)
    {
        StringBuffer str = new StringBuffer();

        for(int i = 0; i < buff.length(); i++)
        {
           char a = 0x00;
           String mbyte = this.CryptXorTable[this.currentPosition];
           String mchar = buff.substring(i, i + 1);
           a = mchar.charAt(0);

           a ^= HexString.fromHexString(mbyte).charAt(0);

           str.append(a);

           this.currentPosition++;

           if(this.currentPosition == 0x1F3)
           {
               this.currentPosition = 0;
           }
        }


        return str.toString();
    }


CryptXorTable ist ein 500 grpßes Array mit HexZeichen wie "D1" usw. [/code]
 

nitschchedu

Mitglied
So um wieder zum Xor zukommen woran kann es liegen das trotzdem bei jeder 4 stelle ein Falsches zeichen steht oO ? Und im PHP nicht.

Code:
 public String Crypt(String buff)
    {
        StringBuffer str = new StringBuffer();

        for(int i = 0; i < buff.length(); i++)
        {
           char a = 0x00;
           String mbyte = this.CryptXorTable[this.currentPosition];
           String mchar = buff.substring(i, i + 1);
           a = mchar.charAt(0);

           a ^= HexString.fromHexString(mbyte).charAt(0);

           str.append(a);

           this.currentPosition++;

           if(this.currentPosition == 0x1F3)
           {
               this.currentPosition = 0;
           }
        }


        return str.toString();
    }


CryptXorTable ist ein 500 grpßes Array mit HexZeichen wie "D1" usw.
 

Murray

Top Contributor
Ohne Glaskugel schwer zu sagen. Was sind die Eingangsdaten, wie sieht das Crypt-Array aus, welche Implementierung steckt hinter HexString.fromHexString(mbyte)? Und welches Byte meinst Du? char a?
 

nitschchedu

Mitglied
Oki wir sind wieder beim Hex ..... laut Wireshark ist das angekommen am Socket
2400c7c6d00a9cbd21892676726380f43dc29ad486a3f15763f4d665bd3fdbe4e10f50f6ec207e9611140e6653e7112aacd9133da5cee63f149fb50d3cb90e41e4679b87c30f
Stringlänge ist 70.

Am socket kommen genau 70 an, doch umgewandelt mit der Funktion von oben kommt.

Code:
   public static String toHexString(String text)
   {
      StringBuilder builder=new StringBuilder(text.length()*2);
      char c;

      for(int i=0; i<text.length(); i++)
      {
         builder.append( ((c=text.charAt(i))<(char)0x10 ? "0" : "")+Integer.toHexString(c));
      }

      return builder.toString();
   }

2400c7c6d00a153bd2120302676726320acf43dc2161d42020a3f15763f4d665bd3fdbe4e10f50f6ec207e201311140e6653e7112aacd9133da5cee63f14178b50d3cb90e41e467203a2021c30f

1. Bissel viel und dann stimmen immer mal zwischen drin Zeichen nicht

2400c7c6d00a9cbd2189...

2400c7c6d00a153bd21203...



@Nehme ich oben den String vom Wireshark so kommt alles richtig raus.
Kann dies auch an meiner Socket lese Funktion liegen ?:
Code:
private Socket client;
private PrintWriter out;
private BufferedReader in;

.....

this.in = new BufferedReader(new InputStreamReader(this.client.getInputStream()));

.....

 private String ReadPacket()
    {
        String buff = "";
        char[] buffer = new char[65536];

        try
        {
            int anz = this.in.read(buffer, 0, 65536);
            buff = new String(buffer, 0, anz);
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }

        System.out.println(HexString.toHexString(buff)); // <--- Fehler bei der Umwandlung
        return buff;
    }
 

Murray

Top Contributor
Da hier offenbar Binärdaten über den Stream gehen, solltest Du diese Daten nicht als textuelle Daten behandeln - nimm also keinen Reader, sondern lies vom InputStream die Bytes ein (und eben keine chars). Irgendwelche Byte-Manipulationen sollten dann auch auf der Byte-Ebene erfolgen (und eben nicht in irgendeiner String-Repräsentation dieser Daten).
 
S

Spacerat

Gast
Huh... Hab' ich mir die Mühe mit meiner Implementation umsonst gemacht (HINT: NÖÖÖÖÖ)? Fakt ist, das diese 70 Bytes bei dieser korrekterweise einen String von genau 140 Zeichen ergibt. Ich versuche mal dir zu folgen...
Du möchtest also den Stream verschlüsseln (Crypt). Etwa so?
Code:
... je nachdem was ankommt (Text oder Hexstrings)...
public String CryptHex(String in, boolean asCharSequence)
{
    HexString a = HexString.parse(in);
    HexString b = HexString.parse(cryptstring);
    a = HexMath.xor(a, b);
    return (asCharSequence)? a.toCharSequence() : a.toString();
}

public String CryptText(String in, boolean asCharSequence)
{
    HexString a = HexString.fromCharSequence(in);
    HexString b = HexString.parse(cryptstring);
    a = HexMath.xor(a, b);
    return (asCharSequence)? a.toCharSequence() : a.toString();
}

den "cryptstring" solltest du als Klassen-Konstante (private static final HexSting) deklarieren. Wie man unschwer erkennen kann steuert "asCharSequence" die Ausgabe. Möglicherweise muß der "cryptstring" aber vorher noch in der Länge angepasst werden, da die HexMath-Methoden den jeweils kürzeren String mit vorangestellten "0"en auffüllt.
Im übrigen hat Murray mit seinem Vorschlag, das Ganze mit Byte-Arrays durchzuführen, natürlich vollkommen recht. Ich denke derweil noch über die jeweiligen "parse" und Ausgabemethoden dafur nach (hat natürlich nicht mit Murrays Vorschlag zu tun, obwohl mich gerade dieser dazu inspiriert hat).

mfg Spacerat
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Wo kommt der Wert der Variable her ? Allgemeine Java-Themen 6
N Wie kommt dieses Ergebnis zu stande Allgemeine Java-Themen 15
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
B OutOfMemoryError kommt nicht/Bug in Java? Allgemeine Java-Themen 2
N [GWT] JavaMail kommt nicht an Allgemeine Java-Themen 9
A Compiler-Fehler Woher kommt der NullPointer? (Collections & Iterator) Allgemeine Java-Themen 7
S Warten, bis ein Impuls von außen kommt. Allgemeine Java-Themen 2
P Ascii Bild aus einem input file nur kommt nix im outputfile an?????? Allgemeine Java-Themen 5
F Geworfene Exception kommt nicht an Allgemeine Java-Themen 6
D Fehler, woher kommt er? Allgemeine Java-Themen 9
F Weiß nicht warum Exception kommt Allgemeine Java-Themen 15
G Warum kommt hier NullPointerException? Allgemeine Java-Themen 3
M HashMap kommt beim Löschen aus dem Tritt Allgemeine Java-Themen 6
E JExcel- Zugriff auf leere Zellen kommt eine Fehlermeldung Allgemeine Java-Themen 6
T Fehlersuche bzw. woher kommt diese ausgabe? Allgemeine Java-Themen 2
C ge2001.exe - Hilfe kommt bei F8 (run) in JCreator Allgemeine Java-Themen 22
R Objekttyp ermitteln das aus generischer Collection kommt Allgemeine Java-Themen 3
P Wann kommt denn nun 1.5 überhaupt? Allgemeine Java-Themen 6
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
S Zeichen | in regex Allgemeine Java-Themen 8
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Checkstyle 100 Zeichen pro Zeile Allgemeine Java-Themen 11
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
Master3000 Komisches Zeichen als Ausgabe in der Konsole Allgemeine Java-Themen 20
M Warum gibt es Unterschiedliche Kommentar Zeichen Allgemeine Java-Themen 15
N Überprüfung ob ein bestimmtes Zeichen <1 mal vorkommt Allgemeine Java-Themen 2
N Prüfen, ob ein String 2x das selbe Zeichen hat Allgemeine Java-Themen 10
G Übermittlung zusätzlicher ASCII-Zeichen bei Übertragung von Dateiinhalt mit Xmodem - JAVA Allgemeine Java-Themen 9
R Wie bekomme ich das Zeichen 'digit' an vorderster Stelle Allgemeine Java-Themen 4
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
Bluedaishi Zeile um zeichen erweitern Allgemeine Java-Themen 9
N Datei Zeilenweise Einlesen, Versteckte Zeichen Allgemeine Java-Themen 5
Xge Replace x Zeichen aus String Allgemeine Java-Themen 2
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen &#8203; Allgemeine Java-Themen 3
E Compiler-Fehler Unicode Zeichen einlesen Allgemeine Java-Themen 1
U Variablen Stringarrays mit wenig verschiedenen Zeichen effizienter speichern Allgemeine Java-Themen 10
T xls-Datei per Apache Commons CsvParser einlesen UTF-8 Zeichen russische Zeichen Allgemeine Java-Themen 2
AssELAss String jeweils nach x Zeichen Zeilenumbruch Allgemeine Java-Themen 1
DStrohma Input/Output KeyEvent nur verarbeiten wenn es ein "sichtbares" Zeichen ist? Allgemeine Java-Themen 1
B In Java String ein + Zeichen Allgemeine Java-Themen 4
AssELAss Zeilenumbruch immer nach bestimmtem Zeichen Allgemeine Java-Themen 1
J Anzahl der Zeichen bei Eingabe begrenzen Allgemeine Java-Themen 5
V Tastendruck für UTF-8 Zeichen emulieren Allgemeine Java-Themen 4
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
C Hex Zeichen ersetzen durch leer Zeichen Allgemeine Java-Themen 5
R Besondere Zeichen in Dateinamen Allgemeine Java-Themen 4
B Alt-Griechisch Zeichen in Dateien Allgemeine Java-Themen 2
G AES Verschlüsselung nur bis 63 Zeichen Länge Allgemeine Java-Themen 2
M Fehlende Zeichen beim Drucken mit PDFBox Allgemeine Java-Themen 10
J String nur erste Zeichen vergleichen Allgemeine Java-Themen 6
C Variablen $-Zeichen in String ersetzen Allgemeine Java-Themen 3
S String Zeichen für Zeichen vergleichen Allgemeine Java-Themen 4
L Problem bei ausführbarer jar Datei mit Unicode-Zeichen Allgemeine Java-Themen 4
S String in Double - letztes Zeichen fehlt Allgemeine Java-Themen 4
A Erstes Zeichen im String "toUpperCase"n Allgemeine Java-Themen 11
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
cedi int Zahl in ein ASCII zeichen umwandeln und dieses in ein externes Textfenster schreiben Allgemeine Java-Themen 6
K String: alle X Zeichen Zeilenumbruch Allgemeine Java-Themen 3
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
Zettelkasten Aus String bestimmtes Zeichen herausfinden Allgemeine Java-Themen 19
M Asterisk in String ("Egal-Zeichen") Allgemeine Java-Themen 4
V Chinesische Zeichen Escapen Allgemeine Java-Themen 4
I Teilweise falsche Darstellung jap. Zeichen im JEditorPane mit RTFEditorKit aus RTF-Datei Allgemeine Java-Themen 5
D Datei mit allen Ascii Zeichen Allgemeine Java-Themen 2
R Unsichtbare Zeichen Allgemeine Java-Themen 7
U Namen von Klassen haben $-Zeichen Allgemeine Java-Themen 5
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
neonfly Anzahl Zeichen pro Zeile auf der Konsole Allgemeine Java-Themen 8
C Strings zwischen 2 Zeichen auslesen Allgemeine Java-Themen 7
A Zeichen beim Eingeben in ein DOS-Fenster nicht anzeigen? Allgemeine Java-Themen 3
F Hexcode von ASCII Zeichen erhalten Allgemeine Java-Themen 2
J Mit Scanner-Klasse eine Datei zeilenweise einlesen und nur bestimmte Zeichen abfragen Allgemeine Java-Themen 11
V Dateien mit &-Zeichen im Namen öffnen Allgemeine Java-Themen 13
N String in einzelne Zeichen zerlegen Allgemeine Java-Themen 8
M Problem mit Zeichen aus einer Datei auslesen Allgemeine Java-Themen 2
T Shapes vergleichen? Zeichen erkennen? Allgemeine Java-Themen 7
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
G Tschechische Zeichen in XML-Antwort Allgemeine Java-Themen 22
J Encoding und Gewinnung von Zeichen aus der Hexa-Darstellung Allgemeine Java-Themen 6
S Stringarray splitten an unbekanntem Zeichen Allgemeine Java-Themen 7
A Dezimalzahlen: Komma-Zeichen Allgemeine Java-Themen 4
T Einzelnes Zeichen von der Tastatur einlesen, aber ohne Enter Allgemeine Java-Themen 4
S Was bedeutet dieser Zeichen Allgemeine Java-Themen 4
E Wie Zeichen eingeben mit Klasse Scanner? Allgemeine Java-Themen 5
S Zeichen, dass Programm noch läuft Allgemeine Java-Themen 3
M Anwendung nur einmal starten / Zeichen in String zählen Allgemeine Java-Themen 7
T [Regex] Zeichen ausschließen Allgemeine Java-Themen 8
Luma Unicode Steuerzeichen von druckbaren Zeichen trennen Allgemeine Java-Themen 10
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
G String parsen und Problem mit escaped zeichen Allgemeine Java-Themen 4
Z Letztes zeichen eines strings löschen Allgemeine Java-Themen 3
A bestimmte Zeichen aus einem String auslesen Allgemeine Java-Themen 2
L unicode-zeichen in ein txt-File schreiben Allgemeine Java-Themen 3
J Problem mit nichtlateinischen Zeichen Allgemeine Java-Themen 2
B String + Zeilenumbruch nach X-Zeichen Allgemeine Java-Themen 4
M Nach 4 Zeichen Fokus ändern Allgemeine Java-Themen 2
oliver1974 Wie ResourceBundles mit Unicode Zeichen korrekt einlesen? Allgemeine Java-Themen 4
E Alarm ausgeben (ASCII Zeichen 7) über Lautsprecher Allgemeine Java-Themen 11
G Alle Zeichen des Alphabets ausgeben Allgemeine Java-Themen 4

Ähnliche Java Themen


Oben