¿Se puede usar xxd para generar la representación binaria del número hexadecimal, no una cadena?

10

Me gustaría generar un paquete binario sin formato a partir de hexadecimal en la línea de comando con el fin de probar un protocolo. Espero que sea más sencillo hacerlo de esta manera que escribir una aplicación.

Esto es lo que sucede actualmente:

echo '0A' | xxd  -b
0000000: 00110000 01000001 00001010

Lo que me gustaría tener es:

echo '0A' | xxd  -b
0000000: 00001010    

o

echo '0A' | xxd  -b
0000000: 01010000    

Como no estoy seguro de la resistencia requerida. Me gustaría poder cambiarlo cuando sea necesario. ¿Es esto posible?

El Ingeniero Significante
fuente

Respuestas:

9

echo '0A'produce tres caracteres 0 A NL:; xxd -bluego imprimirá esos tres caracteres en binario. Si solo desea el byte único cuyo valor es 10 (es decir, hexadecimal A), podría escribir (en bash):

echo -n $'\x0A'
      ^ ^  ^
      | |  |
      | |  +-- `\x` indicates a hexadecimal escape
      | +----- Inside a $' string, escapes are interpreted
      +------- -n suppresses the trailing newline

Una mejor alternativa sería printf '\x0A'; printf interpreta secuencias de escape en la cadena de formato y no genera nuevas líneas implícitas. (Esta es la solución compatible con Posix, que debería funcionar en cualquier shell compatible con Posix.) Otra posibilidad más de bash es echo -n -e '\x0A'; la -ebandera (no estándar) le pide a echo que interprete las secuencias de escape.

echo '1' | xxd -bno generará el equivalente de hexadecimal 50, porque xxdno sabe que 0Aes un número hexadecimal y 1no lo es. Además, el código ascii para el personaje 1es hexadecimal 31, no 50.

Endianness no afecta a los bytes. El orden de los bits dentro de un byte es completamente conceptual hasta que el byte se transmite a través de una línea en serie e incluso entonces solo es visible con un osciloscopio o algo similar.

rici
fuente
Perdón por el 50. Es un error tipográfico. Arreglando ahora
TheMeaningfulEngineer
7

Si desea que la salida binaria para una cadena de dígitos hexadecimales, xxd -r -p. P.ej:

 $ echo '0A0B0C0D' | xxd -r -p | xxd -b
 0000000: 00001010 00001011 00001100 00001101                    ....

convierte 0A0B0C0D en cuatro bytes de binario (primera llamada a xxd) y luego lo vuelve a convertir para que se pueda imprimir (segunda llamada). Dices que quieres una salida binaria, pero los ejemplos que estás intentando son una representación imprimible.

No sé de nada donde la endianidad sea ambigua a nivel de mordisco, como implicas en tu segundo ejemplo. La conversión en xxd es un byte puro a la vez, sin suponer que representan un número particular de varios bytes.

jtniehof
fuente
2

Sí, puede xxdhacerlo, pero puede que no le guste el formato de entrada. Según su ejemplo, 0x0a es el valor hexadecimal de una nueva línea ASCII. Puede crear un archivo con una nueva línea nueva y luego usarlo xxdpara crear la lista:

$ xxd one_line_file
0000000: 0a                                       .

Puede obtener una nueva línea de xxdesa salida si le da los indicadores adecuados:

$ echo "0000000: 0a" | xxd -r > another_one_line_file
$ xxd another_one_line_file
0000000: 0a 

xxdtiene un formato de salida bastante bueno, no creo que sea demasiado oneroso crear sus paquetes usando un editor de texto, luego use xxd -rpara ir a binario. .

Bruce Ediger
fuente