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 OK

    Gruß 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


Anmelden zum Antworten