Tengo una cadena de "SOMETHING /\xff" y quiero guardar la representación hexadecimal de 0xff en un char búfer. Así que me strncpy todo después de la barra diagonal (/) en mi buffer (vamos a llamar a buff).

Sin embargo, cuando uso el gdb comando print \x buff para ver el contenido de buff, no 0xff. Cualquier ideas de lo que podría estar equivocado? Es posible que mi barra diagonal está arruinando las cosas?

  • Esto no es claro. Como ya fue explicado en las respuestas a sus preguntas anteriores, \xff no se almacena en la cadena. Un solo personaje (cuyo valor es 255) se almacena en su lugar.
  • La barra diagonal no debería afectar a los siguientes personajes. ¿Qué gdb mostrar en el buffer?
  • ¿Tienes algún código para ir con ese párrafo?
  • Puedes mostrar el código y lo que se obtiene y lo que usted está esperando para ver?
  • ¿Qué está tratando de tienda? ¿Quieres "0xff" en su cadena o ¿desea que el valor FF almacenado en un byte de su buffer?
  • ¿qué hace el 255 significa?
  • y que este único personaje solo puede tomar sólo la mitad de un byte?
  • Me gustaría que el valor FF almacenados
  • El carácter \xFF (es decir, un personaje con el valor decimal 255) no va a imprimir un carácter visible en la mayoría de los casos.
  • No, se necesitaría un byte.
  • Eso es lo que usted está haciendo, usted probablemente no tiene la impresión de que solo byte como hex en gdb, o su strncpy código es incorrecto.
  • gdb me da los valores hexadecimales 0x5c, 0x78, 0x66, 0x66 cuando trato para almacenar la cadena «\x99 HTTP». Alguna idea?
  • Estás seguro de que no es la dirección de la cadena?
  • Tengo esto por escrito en gdb print /x bufferName
  • Si el buffer es de tipo char*, entonces yo pienso que podría ser la impresión de mal en gdb, compruebe mi respuesta.

InformationsquelleAutor Nosrettap | 2012-04-07

3 Comentarios

  1. 3

    Yo creo que tu problema tiene que ver con la manera en que usted la impresión de la variable en gdb. Tome este sencillo programa, de compilación como de depuración (-g si se usa gcc), y ejecutar y se rompen en el primer puts declaración:

    int main(void)
    {
       char *ptr = "str \xff";
       char arr[] = "str \xff";
       puts(ptr);
       puts(arr);
    
       return 0;
    }

    Si trato de impresión y ptr la forma en que usted ha mencionado, p /x ptr, que va a imprimir el valor de ptr (la dirección está apuntando a):

    (gdb) p /x ptr
    $1 = 0x4005f8

    Sin embargo si hago el mismo comando para arr, voy a conseguir:

    (gdb) p /x arr
    $2 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}

    Que es porque gdb puede ver que arr es de tipo char[6] y no char*. Usted puede obtener los mismos resultados con el comando p /x "str \xff", que es útil para probar las cosas:

    (gdb) p /x "str \xff"
    $3 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}

    Ahora si usted quiere ser capaz de imprimir una cierta cantidad de bytes de la dirección apuntada por un puntero, el uso de la examine (x) memoria de comandos en lugar de la impresión (p):

    (gdb) x/6bx ptr
    0x4005f8 <__dso_handle+8>:  0x73    0x74    0x72    0x20    0xff    0x00

    Que voy a imprimir 6 bytes en hexadecimal de la dirección apuntada por ptr. Trate de que con su buff variable y ver cómo se van.

    Por otra parte, otra cosa que puedes probar es:

    (gdb) p /x (char[6])*ptr
    $4 = {0x73, 0x74, 0x72, 0x20, 0xff, 0x0}

    Esto tratará el char señalado por ptr como el primer elemento en una matriz de 6 chars, y le permitirá utilizar el comando imprimir.

  2. -2

    Tenga en cuenta que una cadena en C es una matriz de char valores. Y un char es un entero de 8 bits la cantidad. (Sólo como una int es un signo de 16 bits la cantidad.) El valor máximo que puede ser colocado en un entero de 8 bits de campo es de 255 decimal que es 0xFF hex o 0377 octal o binario 11111111.

    Dentro de un citada cadena de caracteres en C, la notación \xNN significa para insertar el carácter cuyo valor hexadecimal es NN.

    • -1; Nada de lo dispuesto en la norma dice que char no está firmado, y nada de lo dispuesto en la norma dice que debe ser de 8 bits o que int debe ser de 16 bits. De hecho, en la mayoría de los compiladores de estos días, ints son de 32 bits.

Dejar respuesta

Please enter your comment!
Please enter your name here