ASCII-String -> Hex-String (binary)
-
Wie meinst du das?
Ich habe einen Pointer, der auf einen char-Array zeigt, in dem die Hex-Zahlen als ASCII-Zeichen abgelegt sind. Also zum Beispiel:
arrayASCII[0] = 'A'; arrayASCII[1] = 'B'; arrayASCII[2] = 'C'; arrayASCII[3] = 'D';
Nun möchte ich aber, dass diese Daten wieder binär drin stehen, also so:
arrayBinaer[0] = 0xAB; arrayBinaer[1] = 0xCD;
Wer wandelt mir das dann so um?
Danke!
-
Welche Sprache? Dein Code sieht nach C aus, du fragst im C++ Forum. In C sscanf, in C++ ein stringstream.
-
Ich programmiere in C++.
Sollte sscanf aber perfomanter als stringstream sein, dann werde ich auch dazu greifen.
Ich danke dir, werde mir sscanf und stringstream mal genauer anschauen.
€: myClass:: vor der Methode habe ich weggelassen, da es ja nicht wirklich wichtig ist für das Verständnis meines Problems. Oder gibts in C++ noch eine einfachere Möglichkeit, meine Methode zu implementieren (also die, die ich gepostet habe)?
-
RyoShinzo schrieb:
Sollte sscanf aber perfomanter als stringstream sein, dann werde ich auch dazu greifen.
Wenn es dir auf Performanz ankommt, mache diese einfachen Sachen besser selbst und ohne Lib-Funktionen, die für weitaus universellere Anwendungsfälle gedacht sind:
#define CHR2BIN(c) (c-(c>='A'?55:48)) ... arrayBinaer[0] = CHR2BIN(arrayASCII[0])<<4 | CHR2BIN(arrayASCII[1]); arrayBinaer[1] = CHR2BIN(arrayASCII[2])<<4 | CHR2BIN(arrayASCII[3]); usw.
-
Wutz schrieb:
Wenn es dir auf Performanz ankommt, mache diese einfachen Sachen besser selbst und ohne Lib-Funktionen, die für weitaus universellere Anwendungsfälle gedacht sind:
#define CHR2BIN(c) (c-(c>='A'?55:48)) ... arrayBinaer[0] = CHR2BIN(arrayASCII[0])<<4 | CHR2BIN(arrayASCII[1]); arrayBinaer[1] = CHR2BIN(arrayASCII[2])<<4 | CHR2BIN(arrayASCII[3]); usw.Danke für den Code!
Wenn ich das allerdings richtig interpretiere, dann müsste man eigentlich, wenn c >= 'A' true ergibt, 65 und nicht 55 abziehen, oder?
-
Falls der Wert in Dener Datei in Wirklichkeit einen
intWert darstellen sollte, brauchst Du nicht über die einzelnen Character zu gehen:#include <sstream> int hexString2Int( const std::string& hex_ ) { std::stringstream converter; converter << std::hex << hex_; int num; converter >> num; return num; }
-
@minastaros: Das sind keine int Werte, sondern das ist ein hex-binary String der in ASCII Darstellung gespeichert wurde. Das Programm von Wutz sollte daher gut funktionieren. Hatte sowas in der Art auch vor, aber das war nicht so schön kurz wie seins.

-
RyoShinzo schrieb:
Wenn ich das allerdings richtig interpretiere, dann müsste man eigentlich, wenn c >= 'A' true ergibt, 65 und nicht 55 abziehen, oder?
'A' -> 65 dezimal
0xA -> 10 dezimalDifferenz ist 55 und nicht 65

-
Auch dafür gibt es eine Lösung.
Betrachte den zurückgegebenen String einfach als Container, der nachher den binären Inhalt hat. Man kann natürlich die Sache umbauen, dass das Byte direkt in das Array gesetzt wird, dann übergibt man den Pointer darauf halt als Argument der Funktion. Das Prinzip ist aber das gleiche.std::string hexStringToBinary( const std::string& source_ ) { size_t len = source_.length( ); std::string binaryString; size_t pos = 0; // Bei ungerader Anzahl zuerst nur _ein_ Nibble nehmen if( 0 != ( len % 2 ) ) { unsigned int byte = hexString2Int( source_.substr( pos++, 1 ) ); binaryString.push_back( (char)byte ); } for( ; pos < len; pos += 2 ) { unsigned int byte = hexString2Int( source_.substr( pos, 2 ) ); binaryString.push_back( (char)byte ); } return binaryString; }Edit: wir nehmen das ungerade erste Nibble einfach mit statt Fehlermeldung
-
Wutz schrieb:
'A' -> 65 dezimal
0xA -> 10 dezimalDifferenz ist 55 und nicht 65

Ich nehm alles zurück!

@minastaros: Bevor ich meinen char-Array in einen String, dann in einen int, wieder in einen String und dann letztendlich wieder in einen char-Array umwandle, nehme ich lieber die Methode von Wutz, aber trotzdem danke!
