# HEX String zu einem Byte Array ? *verzweiflung* :(



## babuschka (22. Jul 2005)

Hallo,

ich habe da folgendes kleines Problem und hoffe hier ein wenig hilfe zu finden  :roll: 

Also ich bin gerade dabei ein Programm zu schreiben das mit die Daten aus einem EKG Monitor ließt. Das ganze geschieht über eine UDP Verbindung. Ich habe mir jetzt ein Programm geschrieben das die über UDP senden/empfangen kann. Das funktioniert bis jetzt auch alles ganz gut. Nur leider muss ich dem Monitor bestimmte Hexketten zuschicken damit ich von dem Gerät eine Antwort bekommen und genau da liegt mein Problem. 

Im Moment  wandel ich immer einen String in ein Bytearray um und schicke das ganze dann in einem Paket zu dem Gerät. Was ich jetzt aber an Steuercodes habe liegt alles in Hexformat vor und ich weiß nicht wie ich die Hexwerte "als" Hexwerte senden kann. 

Bsp. 0x1D

würde ich das ganze von Sting zu byte wandeln -> byte = string.getBytes()
so sende ich aber nur ASCII zeichen, wenn ich den Netzverkehr auslesen habe ich im Paket als Datenanhang nur 
0x3144 zu stehen. Da möchte ich aber die 0x1D haben :cry:



Kann mir da bitte jemand weiterhelfen, ein Link ein Codefetzen ihrgendwas wie ich aus dem Hexstring auch Hexdaten senden kann ohne das es in ASCII umgewandelt wird :bahnhof:

Achso was noch blöd ist das byte ja nur von -127 bis 127 geht da das 8te bit als Vorzeichenbit zählt. Ich brauche aber alle 8Bit (255) da im Hexcode auch Werte vorkommen die größer als  0x7F (127) sind.

mit freundlichen Grüßen,
Taki


----------



## stev.glasow (22. Jul 2005)

Taki Haki hat gesagt.:
			
		

> würde ich das ganze von Sting zu byte wandeln -> byte = string.getBytes()
> so sende ich aber nur ASCII zeichen, wenn ich den Netzverkehr auslesen habe ich im Paket als Datenanhang nur
> 0x3144 zu stehen. Da möchte ich aber die 0x1D haben :cry:


Also new String("0x1D".getBytes())  ergibt wieder "0x1D", wenn du den String sendest und diesen dann wieder per new String(bytes) zusammen fügst sollst du also eigentlich wieder zu dem String "0x1D" kommen. Zeig mal deinen Code.



			
				Taki Haki hat gesagt.:
			
		

> Achso was noch blöd ist das byte ja nur von -127 bis 127 geht da das 8te bit als Vorzeichenbit zählt. Ich brauche aber alle 8Bit (255) da im Hexcode auch Werte vorkommen die größer als  0x7F (127) sind.



Willst du jetzt den String senden oder den Wert?

Wenn du den String sendest spielt das keine Rolle und wenn du den Wert senden willst könnest du das so angehen:


```
String hex = "0xFD";
int value = Integer.parseInt(hex.substring(2, hex.length()), 16); 
System.out.println(value);


byte[] bytes = new byte[]{
		(byte)(value & 0xFF),
		(byte)(value >> 8 & 0xFF),
		(byte)(value >> 16 & 0xFF),
		(byte)(value >> 24 & 0xFF)
	};

byte[] bytes2 = bytes; // hier werden sie dann übertragen

int value2 = bytes2[0] & 0xFF | bytes2[1] << 8 & 0xFF | bytes2[2] << 16 & 0xFF | bytes2[3] << 24 & 0xFF;

System.out.println(value2);
```
Oder du sendest 'value' einfach über nen DataInputStream


----------



## babuschka (23. Jul 2005)

Hallo Stevg,

ich möchte den Wert senden. Also wenn ich 0x1D im Hexstering zu stehen habe möchte ich 0x1D auch im netzwerkpaket stehen haben und nicht die ASCII Werte für 0,x,1,D 

ich probiere mal dein Programmstück auch und schreib dir dann wie weit ich damit gekommen bin.

Aber erstmal danke 

bye


----------



## babuschka (23. Jul 2005)

Hier habe ich mal so einen String, die sind normal noch bischen länger aber in der Form müßte ich die Werte per UDP versenden.

0x05 0x08 0x13 0x01 0x00 0x16 0x01 0x02 0x80 0x00 0x14 0x02 0x00 0x02

 ???:L


----------



## babuschka (23. Jul 2005)

ich nochmal :roll:

also ich habe das jetzt so ausprobiert und es funktioniert wunderbar  ich sende genau den Hexwert der im String steht über das Netz. Habe aber...

      (byte)(value >> 8 & 0xFF), 
      (byte)(value >> 16 & 0xFF), 
      (byte)(value >> 24 & 0xFF)

weggelassen da der mir sonst die Hexwerte immer auf 8 Stellen wandelt und 6 davon mit 0 gefüllt sind.
Nun hänge ich noch an einer klitzekleinen Sache fest.

Kann man ein bytearray also byte[] einfach um ein byte erweitern ??? hinten was dranhängen und wenn ja wie ?

denn wenn ich die Hexwerte aus dem String der reihe nach rauskopiere und umwandel muss ich sie ja auch alle wieder in ein bytearry packen damit ich sie dann über das netz schicken kann. Nur wie genau kann man nen bytearray erweitern  :bahnhof: 

mfg Taki


----------



## stev.glasow (23. Jul 2005)

> weggelassen da der mir sonst die Hexwerte immer auf 8 Stellen wandelt und 6 davon mit 0 gefüllt sind.
> Nun hänge ich noch an einer klitzekleinen Sache fest.


???:L 



> Kann man ein bytearray also byte[] einfach um ein byte erweitern ??? hinten was dranhängen und wenn ja wie ?
> 
> denn wenn ich die Hexwerte aus dem String der reihe nach rauskopiere und umwandel muss ich sie ja auch alle wieder in ein bytearry packen damit ich sie dann über das netz schicken kann.



Versteh zwar überhaupt nicht mehr was du das machst aber java.io.ByteArrayOutputStream könnte evtl. sein was du brauchst.


----------



## Bleiglanz (23. Jul 2005)

```
String s = "0x05 0x08 0x13 0x01 0x00 0x16 0x01 0x02 0x80 0x00 0x14 0x02 0x00 0x02 0x1D";
String[] stringValues = s.split("\\s");
byte[] byteValues = new byte[stringValues.length];
for(int i=0;i<stringValues.length;i++)
{
    byteValues[i]=(byte) (Integer.parseInt(stringValues[i].substring(2),16));
	System.out.println(byteValues[i]);   
}
```
was das mit dem

```
byte[] bytes = new byte[]{
      (byte)(value & 0xFF),
      (byte)(value >> 8 & 0xFF),
      (byte)(value >> 16 & 0xFF),
      (byte)(value >> 24 & 0xFF)
   };
```
soll ist mir auch unklar,

0x1D = 1 x 16 + 13 = 29

0x80 = 8 x 16 = 128 als unsigned byte (und wird in Java als -128 angezeigt, macht aber nichts)


sind doch genau die bytes?


----------



## babuschka (23. Jul 2005)

also das mit den 8 stellen. Ich habe einen Hexwert umgewandelt und ihn dann in ein UDPPaket gesteckt und abgeschickt. Dann habe ich mir das Paket per Netzwerksniffer angeschaut und da habe ich dann nicht 0x86 stehen, sondern 0x86000000. Deshalb habe ich die letzten 6 Stellen weggenommen da ich in dem Hex String nur 1Byte Hexwerte habe.

Das mit dem Array, ich versuch es nochmal anders zu erklären  Also ich habe ja den String mit den Hexwerten.
Aus dem wollte ich jetzt immer einen Hexwertrauskopieren diesen umwandeln und in ein Bytearray packen. Danach dann den 2ten Hexwert aus dem String umwandeln in das Bytearray packen. Aber das reinpacken geht wohl nicht so wie ich mir das gedacht habe. Müßte deshalb wohl immer ein neues bytearray erstellen das eine stelle mehr hat als das alte und dann alles aus dem alten ins das neue kopieren und ganz an die letzte Stelle den neuen Hexwert. Das würde ich dann solange machen bis ich alle Hexzeichen aus dem String durchgegangen bin und am Ende müßte ich dann ein Bytearray habe wo alle Hexwerte nach der Reihe aufgelistet drin stehen.

Ich schau mir aber mal  java.io.ByteArrayOutputStream an, vielleicht hilft mir das ja und es gibt ne bessere Lösung.

Taki


----------



## stev.glasow (23. Jul 2005)

@Bleiglanz:
Stimmt, bis 0xFF kann ich's ja einfach casten - übersehen.
Hab einfach den int in nen byte array umgewandelt.

Übrigens fehlen da beim zurückwandeln Klammern:
""int value2 = bytes2[0] & 0xFF | bytes2[1] << (8 & 0xFF) | bytes2[2] << (16 & 0xFF) | bytes2[3] << (24 & 0xFF);""


----------



## babuschka (23. Jul 2005)

@Bleiglanz 

dein code funktioniert wunderbar  ich kannte Split() garnicht. Da Spar ich mir dann ja das ganze kopiere.


```
public void udpSend(int port, String adress, String s) {
			try
				{
				 	DatagramPacket packet;
					DatagramSocket socket = new DatagramSocket();
					
					String[] stringArray = s.split("\\s"); 
					byte[] dataArray = new byte[stringArray.length]; 
					for(int i=0;i<stringArray.length;i++) 
					{ 
						dataArray[i]=(byte) (Integer.parseInt(stringArray[i].substring(2),16)); 
					    //System.out.println(byteValues[i]);    
					}
					
					InetAddress ia = InetAddress.getByName( adress );
			        packet = new DatagramPacket( dataArray, dataArray.length, ia, port );
					
					// Paket senden
					socket.send( packet );
					
			    }
			 catch ( Exception e )
			    {
					System.out.println( e );
				}
			 
		}
```
so sieht das jetzt nu aus.
Dickes Danke an euch zwei :applaus:


----------



## babuschka (24. Jul 2005)

hmm neue Frage  wie bekomme ich den aus nem Bytearray die Hexwerte raus und in nen String rein???
mir war so als wenn es da ne decode methode gibt  ???:L 

mfg taki


----------



## babuschka (24. Jul 2005)

```
byte        recieveData[]	= recievePacket.getData();

StringBuffer sb = new StringBuffer(recieveData.length * 2);// StringBuilder in 1.5
for(int x = 0 ; x < recieveData.length ; x++)
{
         sb.append("0x"+( "0" + Integer.toHexString(0xff & recieveData[x])).substring(0, 2)+" ");
}

stringOUT = sb.toString();
```

wenn ich bei dem substring 1 bis 3 nehme bekomme ich immer nen Fehler


----------



## Nick H. (25. Jul 2005)

> Achso was noch blöd ist das byte ja nur von -127 bis 127 geht



das stimmt doch gar nicht oder?
das wären doch 255 mit der Null
das müsste doch entweder von -127 bis 128
oder von -128 bis 127 gehen oder nicht?


----------



## byte (25. Jul 2005)

hä? wo steckt da denn die logik?

1 byte sind 8 bit. 127 dezimal ist binär 1111111. das achte bit braucht man für das vorzeichen, demnach kannst du also nur zahlen von -127 bis 127 speichern.


----------



## Bleiglanz (25. Jul 2005)

natürlich hat man 256 mögliche Werte, ein byte ist ein byte

es geht von -128 bis 127 (einschliesslich)


----------



## babuschka (25. Jul 2005)

hmm :? hat den niemand was um nen Bytearray in Hex umzuwandeln. Mit meinem Code kann ich einen einzelnen Bytewert umwandeln, aber wenn ich dann versuche nen ganzen Array umzuwandeln bekomme ich immer nen Fehler    ???:L


----------



## Bleiglanz (26. Jul 2005)

welchen


----------

