2012-08-16 31 views
7

Tengo una estructura, un puntero a una estructura, y deseo imprimirf los primeros n bytes como un número hexadecimal largo, o como una cadena de bytes hexadecimales.Impresión de datos en bruto a una salida hexadecimal de longitud fija

Esencialmente necesito el equivalente de printf del comando de memoria de examen de gdb, x/nxb.

Si es posible, me gustaría seguir utilizando printf como la función del registrador del programa como una variante de ella. Aún mejor si puedo hacerlo sin recorrer los datos.

Respuesta

7

acaba de tomar el consejo de Eric Postpischil y cocinaron el siguiente:

struct mystruc 
{ 
    int a; 
    char b; 
    float c; 
}; 

int main(int argc, char** argv) 
{ 
    struct mystruc structVar={5,'a',3.9}; 
    struct mystruc* strucPtr=&structVar; 
    unsigned char* charPtr=(unsigned char*)strucPtr; 
    int i; 
    printf("structure size : %zu bytes\n",sizeof(struct mystruc)); 
    for(i=0;i<sizeof(struct mystruc);i++) 
     printf("%02x ",charPtr[i]); 

    return 0; 
} 

se imprimirá los bytes que concierne a la estructura tramos.

Actualización: Gracias por la información Eric :) He actualizado el código.

+2

Los tamaños se deben imprimir con "% zu". Este es el formato para el tipo 'size_t' sin signo, que puede diferir del tipo 'int' firmado para el que '% d' es. Y puede ser preferible imprimir bytes con "% 02x" en lugar de "% x". Este último imprime solo un dígito si el valor es lo suficientemente pequeño. –

1

Pruebe esto. Supongamos que tiene un puntero a struct en pstruct.

unsigned long long *aslong = (unsigned long long *)pstruct; 
printf("%08x%08x%08x%08x%08x%08x%08x%08x", 
     aslong[0], 
     aslong[1], 
     aslong[2], 
     aslong[3], 
     aslong[4], 
     aslong[5], 
     aslong[6], 
     aslong[7], 
); 

Como señala Eric, esto podría imprimir los bytes fuera de servicio. Entonces es esto o usando unsigned char * y (teniendo un printf con 64 argumentos o usando un bucle).

+3

Esto debería usar 'unsigned char'. 'char' puede estar firmado, en cuyo caso la promoción a' int' que se produce al pasar a printf hará que los valores negativos aparezcan como valores negativos de 32 bits. Por ejemplo, el byte 0xff se imprimirá como "ffffffff". Además, "% 02x" es un mejor formato para usar, ya que es probable que desee ceros a la izquierda en lugar de espacios. –

+0

El problema con esta solución es que necesito imprimir 64 bytes, en lugar de 3. – rhlee

+0

@EricPostpischil: gracias por los comentarios. unsigned es de hecho el camino a seguir, y '0' también. – Claudiu

Cuestiones relacionadas