Umwandlung String -> Hex
-
Hallo Zusammen,
ich habe ein Problem bei Umwandlung!
ich habe so ein Hex-Wert: 0x89
Das ist aber ein String.
Ich entferne 0x und bleiben noch 89 übrig.Bei Umstellung nach Hex, gibt er mir so was aus: FFFFFF89
Weiß jemand woran es liegen kann?

Gruß Studi
-
Hallo
Das liegt an deiner "Umwandlung". Was daran falsch ist können wir dir nicht sagen, da du nicht erwähnt hast was du denn überhaupt zur Umwandlung benutzt.
Desweiteren ist "hex" kein Datentyp.Ich vermute du brauchst so was wie std::hex für den stringstream
/Edit : VCL-Sachen entfernt
bis bald
akari
-
Hier der Code:
const int ChlProtocol::CreatePackage( const char* data, const unsigned int len, char* package, const unsigned int plen) //len ist die Länge von data, *package ist was man zurückgibt //data = <ETX><0x89><'b'><0xFF><ESC><'A'><0x57><STX> //8 Zeichen ist plen, len ist 47 { int i = 0; char mydata[ MAXLEN_DATA_HL ]; //MAXLEN_DATA_HL = 47 char *tmp; char *Token[ PACKAGE_SIZE_HL_ALL + 3 ];//PACKAGE_SIZE_HL_ALL = 8 char buffer[4] = {'\0','\0','\0','\0'}; int bufidx = 0; enum _myZeichen { eNone = 0, eChar, eHex, eCtrl } myZeichen; if( plen < PACKAGE_SIZE_HL_ALL ) return 0; if( data == NULL || package == NULL ) return 0; // Datenbereich initialisieren memset( mydata, 0, MAXLEN_DATA_HL); memcpy( mydata, data, len ); Token[0] = strtok(mydata, "<*>"); do { // Zeichen init myZeichen = eNone; bufidx = 0; tmp = Token[i]; while( *tmp != '>' && tmp != NULL) { if( myZeichen == eNone ) { switch( *tmp ) { case '\'': myZeichen = eChar; break; case '0': myZeichen = eHex; break; case '<': myZeichen = eNone; break; default: myZeichen = eCtrl; buffer[bufidx] = *tmp; bufidx++; } } else { switch( myZeichen ) { case eChar: package[i] = *tmp; *(tmp + 1) = '>'; break; //--------- Ab hier stimmt was nicht!!! case eHex : // x löschen if( *tmp == 'x' ) break; // char -> int buffer[0] = (*tmp - '0'); // HEX Char korigieren if( buffer[0] > 9 ) buffer[0] -= 7; // Wert berechnen if( bufidx == 0 ) package[i] = buffer[0] * 16; else { package[i] += buffer[0]; *(tmp + 1) = '>'; } bufidx++; break; //-------- bis hier!!! case eCtrl: buffer[bufidx] = *tmp; bufidx++; if( bufidx >= 3 ) { // Zeichenkette vollständig if( strstr(buffer, "SOH") != NULL ) package[i] = 1; else if( strstr(buffer, "STX") != NULL ) package[i] = 2; else if( strstr(buffer, "ETX") != NULL ) package[i] = 3; else if( strstr(buffer, "EOT") != NULL ) package[i] = 4; else if( strstr(buffer, "ETB") != NULL ) package[i] = 17; else if( strstr(buffer, "ESC") != NULL ) package[i] = 27; else package[i] = 0; *(tmp + 1) = '>'; } break; case eNone: default: return 0; } } tmp++; } // next Token i++; }while( (Token[i] = strtok(NULL, "<*>")) != NULL); return i; }Ausgabe: <3><FFFFFF89><62><FFFFFFFF><27><41><57><2>
1. Wert OK
2. Wert nicht OK!
3. Wert OK
4. Wert nicht OK!
5. Wert OK
6. Wert OK
7. Wert OKGruß Studi
-
Package ist ein Zeiger auf char (Und da Dein Compiler das als signed char interpretiert geht der Wertebereich von -128 bis +127 (oder 0x7F). Alles was größer als 0x7F ist wird als negative Zahl interpretiert.
Also einfach Package als unsigned char* definieren.DJohn