2012-05-23 18 views
15

Ho cercato il carattere * in una stringa esadecimale, ma l'implementazione trovata ha aggiunto alcuni elementi non esistenti alla fine della stringa esadecimale. Ricevo pacchetti dal socket e ho bisogno di convertirlo in stringa esadecimale per il log (buffer con terminazione nulla). Qualcuno può consigliarmi una buona implementazione per C++?Array di caratteri a stringa esadecimale C++

Grazie!

+1

Che cosa intendi esattamente per stringa esadecimale? –

+0

Hai provato a correggere l'implementazione? Puoi pubblicare l'implementazione e alcuni input/output? – dirkgently

+1

"aggiunge un po 'di spazzatura inesistente alla fine della stringa esadecimale" - probabilmente stai passando un buffer terminato non nullo in una funzione che si aspetta LPSTR. Non tutto char * è una stringa. –

risposta

7

Qui c'è qualcosa:

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

Si potrebbe utilizzare std::hex

Eg.

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

Non so cosa pensi 'std: : hex' cambia per l'output di 'char *', ma dovresti creare una demo funzionante. –

7

La più semplice:

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

penso che non funzioni con le stringhe con terminazione null – Roman

+1

Perché no? Funziona esattamente con una stringa terminata da null ('* p'). – demi

+3

Questo * solo * funziona per stringhe nul-terminate. Quindi molto probabilmente, gli darà solo lo stesso problema che lo ha spinto a fare la sua domanda. –

2

Codice frammento di codice fornisce l'ordine dei byte errato nella stringa, quindi ho risolto un po '.

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

Questo potrebbe essere un commento alla risposta di K-ballo o dovrebbe essere una risposta (e potresti citare quale problema hai risolto). Si prega di modificare. – dirkgently

11

Supponiamo che i dati siano un carattere *. esempio di lavoro utilizzando std :: esadecimale:

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

Oppure, se si desidera mantenere il tutto in una stringa:

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

Devi usare std: setfill e std :: setw per convertire correttamente. vedere: http://stackoverflow.com/a/7639754/1731454 – oferei

0

Si può provare questo codice per la conversione di byte da pacchetto a una stringa null-terminated e memorizzare nella variabile "string" per l'elaborazione.

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; 

Quando inviamo un messaggio con esadecimale byte 0x01020E0F, "dati" variabili aveva array di caratteri con la stringa "01020e0f".

Problemi correlati