es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Impresión de un número variable de bytes utilizando cadenas de formato con printf.

Objetivo: Imprimir una cantidad variable de bytes utilizando un solo especificador de formato.

Entorno: Ubuntu 20.04.3 LTS x86-64 en una máquina virtual en una máquina anfitriona x86-64.

Ejemplo:

Sea %kmagic el especificador de formato que estoy buscando, que imprime k bytes sacándolos de la pila y añadiéndolos a la salida. Entonces, para %rsp apuntando a una región en memoria que contiene los bytes 0xde 0xad 0xbe 0xef, quiero que printf("Próximos 4 bytes en la pila: %4magic") imprima Próximos 4 bytes en la pila: deadbeef.

Lo que he intentado hasta ahora:

1) %khhx, que desafortunadamente solo da como resultado k-1 espacios en blanco seguido de dos caracteres hexadecimales (un byte de datos).
2) %kx, que esperaba que imprimiría k/2 bytes interpretados como un número. Esto solo imprime 8 caracteres hexadecimales (4 bytes) antepuestos por k – 8 espacios en blanco.

El número de caracteres no en blanco impresos coincide con la longitud de los especificadores de formato, es decir, la longitud esperada de %hhx es 2, que también es la cantidad de caracteres no en blanco impresos. Lo mismo ocurre con %x, que se espera que imprima 8 caracteres.

Pregunta:
¿Es posible obtener el comportamiento deseado? Si es así, ¿cómo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basándonos en el intento proporcionado, parece que no es posible utilizar un único especificador de formato para imprimir una cantidad variable de bytes. El especificador de formato debe tener una longitud fija para interpretar el número correcto de bytes.

    Una posible solución alternativa es primero leer los bytes en un búfer y luego usar un bucle para imprimir cada byte por separado utilizando un especificador de formato de longitud fija como %02x para valores hexadecimales. Por ejemplo:

    char bytes[] = {0xde, 0xad, 0xbe, 0xef};
    int len = sizeof(bytes);
    for (int i = 0; i < len; i++) {
        printf("%02x", bytes[i]);
    }
    

    Esto producirá la salida deadbeef, que es el resultado deseado. Sin embargo, este enfoque requiere asignación adicional de memoria e iteraciones de bucle, lo cual puede no ser práctico para grandes matrices de bytes.

Comments are closed.