2012-05-23 9 views
15

Ich habe char * zu Hexadezimalstring vor gesucht, aber die Implementierung, die ich gefunden habe, fügt einige nicht existierende Müll am Ende der Hexadezimalkette hinzu. Ich empfange Pakete von Socket, und ich muss es in hexadezimale Zeichenfolge für Protokoll (Null-terminierten Puffer) konvertieren. Kann mir jemand eine gute Implementierung für C++ empfehlen?Char-Array zu hexadezimale Zeichenfolge C++

Danke!

+1

Was genau meinen Sie mit Hex-String? –

+0

Haben Sie versucht, die Implementierung zu reparieren? Können Sie die Implementierung und einige Eingaben/Ausgaben veröffentlichen? – dirkgently

+1

"fügt am Ende der hexadezimalen Zeichenfolge einen nicht vorhandenen Abfall hinzu" - wahrscheinlich übergeben Sie einen nicht null-terminierten Puffer an eine Funktion, die LPSTR erwartet. Nicht alles char * ist eine Zeichenkette. –

Antwort

7

Hier ist etwas:

char const hex_chars[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 

for(int i = data; i < data_length; ++i) 
{ 
    char const byte = data[i]; 

    string += hex_chars[ (byte & 0xF0) >> 4 ]; 
    string += hex_chars[ (byte & 0x0F) >> 0 ]; 
} 
2

Sie könnten std::hex

Eg verwenden.

std::cout << std::hex << packet; 
+5

Ich weiß nicht, was Sie denken 'Std: : hex 'ändert sich für' char * 'Ausgabe, aber Sie sollten eine funktionierende Demo erstellen. –

7

Die einfachste:

int main() 
{ 
    const char* str = "hello"; 
    for (const char* p = str; *p; ++p) 
    { 
     printf("%02x", *p); 
    } 
    printf("\n"); 
    return 0; 
} 
+0

Ich denke, es funktioniert nicht mit nullterminierten Strings – Roman

+1

Warum nicht? Es funktioniert genau für Null terminierte Zeichenfolge ('* p'). – demi

+3

Dieses * only * funktioniert nur für Strings, die nicht enden können. Also wird es höchstwahrscheinlich genau das gleiche Problem geben, das ihn veranlasst hat, seine Frage zu stellen. –

2

-Code-Snippet oben liefert falsche Byte-Reihenfolge in einem String, so dass ich regelte es ein wenig.

char const hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B','C','D','E','F'}; 

std::string byte_2_str(char* bytes, int size) { 
    std::string str; 
    for (int i = 0; i < size; ++i) { 
    const char ch = bytes[i]; 
    str.append(&hex[(ch & 0xF0) >> 4], 1); 
    str.append(&hex[ch & 0xF], 1); 
    } 
    return str; 
} 
+1

Dies könnte entweder ein Kommentar zu K-Ballos Antwort sein oder sollte eine Antwort sein (und Sie könnten erwähnen, welches Problem Sie behoben haben). Bitte bearbeiten. – dirkgently

11

Angenommen, Daten sind ein Zeichen *. Arbeitsbeispiel std :: hex:

for(int i=0; i<data_length; ++i) 
    std::cout << std::hex << (int)data[i]; 

Oder wenn Sie wollen alles in einem String halten:

std::stringstream ss; 
for(int i=0; i<data_length; ++i) 
    ss << std::hex << (int)data[i]; 
std::string mystr = ss.str(); 
+10

Um korrekt zu konvertieren, müssen Sie std: setfill und std :: setw verwenden. siehe: http://stackoverflow.com/a/7639754/1731454 – oferei

0

Sie diesen Code versuchen können für Bytes von Paket zu einem nullterminierten String Umwandlung und speichert für die Verarbeitung die Variable "string".

const int buffer_size = 2048; 
// variable for storing buffer as printable HEX string 
char data[buffer_size*2]; 
// receive message from socket 
int ret = recvfrom(sock, buffer, sizeofbuffer, 0, reinterpret_cast<SOCKADDR *>(&from), &size); 
// bytes converting cycle 
for (int i=0,j=0; i<ret; i++,j+=2){ 
    char res[2]; 
    itoa((buffer[i] & 0xFF), res, 16); 
     if (res[1] == 0) { 
      data[j] = 0x30; data[j+1] = res[0]; 
     }else { 
      data[j] = res[0]; data[j + 1] = res[1]; 
     } 
} 
// Null-Terminating the string with converted buffer 
data[(ret * 2)] = 0; 

Wenn wir Nachricht mit hex senden Bytes 0x01020E0F, variable "data" char-Array mit String "01020e0f" hatte.