Entwickler-Ecke
Basistechnologien - Hexwerte im String in "echte" Hexwerte umwandeln
Zumlin - Di 15.07.08 12:36
Titel: Hexwerte im String in "echte" Hexwerte umwandeln
Hallo zusammen,
ich habe das bereits in einem anderen Forum gepostet, bin dort aber zu keiner Lösung gekommen. Mein Problem:
Ich habe einen String der Form: "00 01 02 03" dieser soll die Hexzeichen 0x00, 0x01, 0x02 und 0x03 symbolisieren. Jetzt will ich das ganze in ein byte-Array umwandeln, in dem die symbolisierten (also 0x00 etc) Hexwerte abgelegt werden. Das habe ich mit Hilfe anderer bisweilen so gelöst, wobei str mein String ist:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| public static string HexToAsc(string str) { string[] hex = str.Split(); string result = null; for (int i = 0; i < hex.Length; ++i) result += (char)Convert.ToUInt16(hex[i], 16); return result; }
string asciistringtisend = HexToAsc(stringtosend); byte[] buffer = Encoding.UTF8.GetBytes(asciistringtosend); int laenge = buffer.Length; for( int r= 0; r<laenge;r++) { if(buffer[r] == 0xC2) { for(int k = r; k<buffer.Length-1;k++) buffer[k] = buffer[k+1]; laenge--; } } byte[] befehl = new byte[laenge]; for(int l = 0; l<lange;l++) befehl[l] = buffer[l]; |
Das Problem ist, dass es nicht mi allen Zeichen geht. Irgendwas passt wohl mit dem "Encoding.UTF8.GetBytes" nicht. da Ich aber auch "signed-Werte" brauche schien mir das als einziges passend.
Damals habe ich meinen Workauround für die mir bekannten Fehler erweitert für die Zeichen 0xC2 0x83 0xAF. Jetzt will ich aber gern das ganz fehlerfrei bekommen. Hat jemand ne Ahnung woran es liegt und was man ändern muss?
Kha - Di 15.07.08 13:12
Schau dir einmal die HexToAsc-Funktion an: Hier extrahierst du schon die einzelnen Bytes, wozu also sie dann wieder zu Ascii-Text zusammenwerfen und als UTF8(!) wieder auslesen? Als Einzeiler:
C#-Quelltext
1: 2: 3: 4:
| static byte[] HexToBytes(string s) { return s.Split().Select(hex => byte.Parse(hex)).ToArray(); } |
Zumlin - Di 15.07.08 14:15
Puhh. Bei dem Einzeiler kapier ich schon das Split nicht. Was soll das ohne ein Argument machen? Was macht Select()? Das kenne ich auch nicht zudem gibt es das bei mir garnicht. Muss ich dazu noch was einbinden?
Bin leider ein Neuling hier...
Kha - Di 15.07.08 15:56
Zumlin hat folgendes geschrieben: |
Was soll das ohne ein Argument machen? |
Äh, das habe ich aus deinem Quelltext übernommen...
Um meinen ersten Satz noch einmal umzuformulieren: Setze in der HexToAsc-Funktion keinen String zusammen, sondern direkt ein Byte-Array.
Byte-Array mit Länge von hex erstellen und die Einträge in einer for-Schleife übertragen.
Zumlin - Mi 16.07.08 14:28
Oh, das war ein Fehler. Split() muss natürlich Split(' ') heißen.
Ich cheks aber echt immer noch nicht. Hier mein Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| byte[] HextoAsc(string str) { string[] hexstring = str.Trim().Split(' '); byte[] hexbytearray = new byte[hexstring.Length]; for(int i = 0; i<hexbytearray.Length;i++) hexbytearray[i] = byte.Parse(hexstring[i]); return hexbytearray; } |
Ich habs so versucht, aber auch hier der gleiche Effekt. Sobald das MSB des ASCII Wertes high wird, funktionierts nicht mehr da die Funktion unter nem ASCII Wert eben einen unsigned Wert versteht. Ich möchte aber in der Lage sein von 0x00 bis 0xFF alles abzudecken.
Kha - Mi 16.07.08 18:50
Zumlin hat folgendes geschrieben: |
Oh, das war ein Fehler. |
Nö :P . Ich schreibe nur Richtiges ab :zwinker: .
Ich bin mir nicht sicher, wie du die vorzeichenlosen Werte nun signed interpretieren willst, aber da du vom MSB sprichst, würde ich den Wert von byte.Parse einfach nach
sbyte casten.
Zumlin - Do 24.07.08 11:22
Sorry für die Lange Zeit des Schweigens. ein cast auf sbyte brachte auch keinen Vorteil.Sobald das MSB gesetzt war wurde mit einem Fehler das Programm beendet.
Ich hab jetzt wieder meinen ursprünglichen Code am laufen mit ner kleinen Modifikation. "UTF8" habe ich mit "Default" ersetzt. Jetzt scheint es zu funktionieren. Ich habe zwar keine Ahnung obs dann auch auf anderen Rechnern läuft, aber das ist mir jetzt egal :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!