# Hex-String zu byte transformieren



## Julian R. (8. Dez 2010)

Hallo Zusammen! 

Ich arbeite derzeit an einem Programm, bei welchem ich einen String mit mehreren, verschiedenen Hex-Werten in einem String ( bspw. "FF 23 B7 C3 10 69 AA") bekomme und diese in einem byte-Array abspeichern will.

Mein Problem hierbei ist, dass manche dieser Werte falsch gewandelt werden. Beispielsweise wird "FF" zu "-1" und "B7" zu "-73".
Hierbei habe ich ein gewisses Schema entdeckt:

„FF“ => 1111 1111 => invertieren: 0000 0000 => +1: 0000 0001 => *(-1): Ergebnis = (-1)
„B7“ => 1011 0111 => invertieren: 0100 1000 => +1: 0100 1001 => *(-1): Ergebnis = (-73)


Hier der relevante Codeausschnitt:

```
String string = "FF";
int len = string.length(); 	
byte[] byteArray = new byte[len / 2]; 

for (int x = 0; x < len; x += 2) { 
     byteArray [x / 2] = (byte) ((Character.digit(string.charAt(x), 16) << 4) 
		     + Character.digit(string.charAt(x+1), 16)); 
}
```

Alternative Umformalgorithmen (bringen das selbe Ergebnis!):

```
for (int x=0;x<string.length()/2;x++) { 
     byteArray[x] = (Integer.decode( "0x"+string.substring(x*2, (x+1)*2))).byteValue(); 
} 
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////			    
				    
String hexVal = "0123456789ABCDEF"; 
for( int x = 0; x < len; x += 2 ) { 
     //make a bit representation in an int of the hex value  
     int hn = hexVal.indexOf( string.charAt( x ) ); 
     int ln = hexVal.indexOf( string.charAt( x + 1 ) ); 
     //now just shift the high order nibble and add them together 
     byteArray[x/2] = (byte)( ( hn << 4 ) | ln ); 
}
```



Ich hoffe ihr könnt mir weiterhelfen! 
Danke dafür schonmal an dieser Stelle!


Mit freundlichen Grüßen,

Julian R.


----------



## Andi_CH (8. Dez 2010)

Julian R. hat gesagt.:


> Mein Problem hierbei ist, dass manche dieser Werte falsch gewandelt werden. Beispielsweise wird "FF" zu "-1" und "B7" zu "-73".
> Hierbei habe ich ein gewisses Schema entdeckt:
> 
> „FF“ => 1111 1111 => invertieren: 0000 0000 => +1: 0000 0001 => *(-1): Ergebnis = (-1)
> „B7“ => 1011 0111 => invertieren: 0100 1000 => +1: 0100 1001 => *(-1): Ergebnis = (-73)



Das ist nicht falsch sondern genau das was ein Byte halt ist.

sie zum Beispiel hier

hier ist es vielleicht etwas übersichtlicher

Hier steht:
Datenelemente im Detail

public static final byte MIN_VALUE = -128
Der niedrigste Wert, den der Typ byte speichern kann.

public static final byte MAX_VALUE = 127
Der höchste Wert, den der Typ byte speichern kann.


und was du oben so schön erklärst nennt man 2er Komplement und ist die Art wie negative Zahlen (nicht nur in Java) abgebildet werden.


----------



## Julian R. (8. Dez 2010)

hm okay, das erklärt natürlich einiges 

Dann muss ich mal sehn ob ich das ganze nicht über ein anderes Format bewerkstelligen kann :-S


Danke dir für die schnelle Antwort! ;-)


----------



## Andi_CH (8. Dez 2010)

Mir ist einfach unklar was du überhaupt willst bzw. wo das Problem ist?


----------



## Julian R. (8. Dez 2010)

hehe ähm ^^
Sorry für meine fehlenden Erklärungen ;-)


Ich will im Grunde auf einen Com-Port mit einem Output-Stream Hex-Nachrichten senden.
Und dafür muss ich die Werte aus einem String in ein byte-Array schreiben.

Ich denke mal, dass - da du das oben so geschrieben hast - egal ist ob im Array nun "-1" oder "255" steht ?!


----------



## Andi_CH (8. Dez 2010)

Hm also im Array drin steht auf jeden Fall FF - wenn das nur ein Darstellungsproblem ist (FF wird halt als -128 dargestellt) ist gar kein Problem vorhanden.

Eigentlich zielte meine Frage darauf hin ob es ein Problem zu lösen gibt ;-)


----------



## XHelp (8. Dez 2010)

Andi_CH hat gesagt.:


> (FF wird halt als -128 dargestellt)



Du meinst eher -1.

Wenn es darum geht einfach nur eine 0..255 Ausgabe zu bekommen, dann kannst du auch:

```
byte b = (byte) 0xB7;
System.out.println(b); //-73
System.out.println(b&0xFF); //183
```
machen.


----------



## Andi_CH (8. Dez 2010)

XHelp hat gesagt.:


> Du meinst eher -1.


ja natürlich .....


----------

