2012-05-23 20 views
15

He buscado char * a cadena hexadecimal antes, pero la implementación que encontré agrega algo de basura no existente al final de la cadena hexadecimal. Recibo paquetes del socket, y necesito convertirlo a una cadena hexadecimal para log (buffer terminado en nulo). ¿Puede alguien recomendarme una buena implementación para C++?matriz de caracteres a cadena hexadecimal C++

Gracias!

+1

¿Qué quiere decir exactamente por cadena hexagonal? –

+0

¿Has intentado arreglar la implementación? ¿Puedes publicar la implementación y alguna entrada/salida? – dirkgently

+1

"agrega algo de basura no existente al final de la cadena hexadecimal": probablemente está pasando un búfer terminado no nulo a una función que espera LPSTR. No todo char * es una cadena. –

Respuesta

7

Aquí es algo:

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

Usted podría utilizar std::hex

Ej.

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

No sé qué piensas 'std: : hex' cambia para la salida 'char *', pero deberías construir una demostración funcional. –

7

El más simple:

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

Creo que no funciona con cadenas terminadas en nulo – Roman

+1

¿Por qué no? Funciona exactamente para cadena terminada nula ('* p'). – demi

+3

Este * solo * funciona para strings nul-terminate. Por lo tanto, lo más probable es que le dé el mismo problema que lo llevó a formular su pregunta. –

2

Código fragmento anterior proporciona el orden de bytes incorrectos en la cadena, por lo que fija un poco.

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

Esto podría ser un comentario a la respuesta de K-ballo o debería ser una respuesta (y podría mencionar el problema que ha solucionado). Por favor edita. – dirkgently

11

Suposición de datos es un char *. Ejemplo de trabajo utilizando std :: hex:

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

O si desea mantener todo en una cadena:

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

Tienes que usar std: setfill y std :: setw para convertir correctamente. ver: http://stackoverflow.com/a/7639754/1731454 – oferei

0

Puede probar este código de bytes para la conversión de paquete a una cadena terminada en cero y almacenar en la variable "cadena" para el procesamiento.

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; 

El hecho de enviar mensaje con hex bytes 0x01020E0F, "datos" variables tenía matriz de caracteres con la cadena "01020e0f".

Cuestiones relacionadas