# XOR Checksum?



## Sc0rP1En (4. Aug 2011)

Hallo Forum

Ich steh grad voll auf der Leitung.

Ich habe einen Hexstring "3F037F9E". Von diesem muss ich die XOR Checksum berechnen und dann hinten anhängen. Laut Vorgabe sollte hierbei "DD" herauskommen. Leider habe ich keine Ahnung davon.

Habe mich im Internet ein bisschen schlau gemacht und dann folgenden Code versucht:


```
String hex = "3F037F9E";
		int cs = 0;
		
		byte[] array = hexStringToByteArray(hex);
		
		for(int i = 0;i<array.length;i++)
		{
			cs=cs^array[i];
		}
		
		System.out.println(cs);
```

Dabei wandle ich den Hexstring "hex" in ein byte[] "array" um. In der Forschleife greife ich auf alle Elemente des Arrays zu und XOR sie miteinander mit "^". Als Ergebnis bekomme ich aber -35 als Byte was in HEX aber "00 23" statt DD ist.

Was mache ich falsch?
Ich hoffe  ihr könnt mir helfen. Danke schon im Voraus.

greets
Sc0rP1En


----------



## SlaterB (4. Aug 2011)

das Ziel ist:
den String in einzelne Bytes zerlegen, 3F, 03, 7F, 9E,
von diesen 4 bytes die 4 jeweils ersten Bits xoren, die zweiten Bits usw., ergibt 8 Kontrollbit, die zusammen sind ein byte, nämlich DD

The Magic of XOR
ab "Parity Check"

zu finden mit dem schweren Suchbegriff 'XOR Checksum'

edit:
ok, mit der Antwort von turtle wird ersichtlich dass es ja schon ziemlich weit hinkommt


----------



## turtle (4. Aug 2011)

256-35=221=0xDD


----------



## Sc0rP1En (4. Aug 2011)

Danke für eure schnellen Antworten. 

Die Methode von Turtle funktioniert nur, wenn mit meiner Funktion ein negatives Ergebnis rauskommt.

Ich werde mal die Seite anschauen, die du mir verlinkt hast.


----------



## HoaX (4. Aug 2011)

Sc0rP1En hat gesagt.:


> Als Ergebnis bekomme ich aber -35 als Byte was in HEX aber "00 23" statt DD ist.


Nö, 35 ist 0x23, aber -35 ist als Byte 0xdd bzw als Short 0xffdd, Zweierkomplement halt. Das Minus darfst du eben nicht einfach unterschlagen.

Integer.toHexString(-35) ergibt auch ffffffdd.


----------



## Sc0rP1En (4. Aug 2011)

So ich habe es jetzt mit meiner Methode + der von Hoax gemacht. Das Ergebnis, das bei mir herauskommt einfach mit Integer.toHexString(-35) verändern und am Ende mit Substring die letzten beiden Zeichen verwenden.

Danke für eure Hilfe!


----------



## HoaX (4. Aug 2011)

Der schönste Weg wäre

```
byte cs = 0;
...
int i = cs & 0xff;
String s = Integer.toHexString(i);
```


----------

