Mi respuesta original era incorrecto - xxd
no puede aceptar cualquiera -p
o -r
con -b
...
Dado que las otras respuestas son viables, y en interés de " otra forma ", ¿qué tal lo siguiente:
Entrada
$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Salida
$ hexdump -Cv < instructions.bin
00000000 00 00 00 13 02 d1 20 83 00 73 02 b3 00 73 04 33 |...... ..s...s.3|
00000010 00 73 64 b3 00 00 00 13 |.sd.....|
00000018
Tubería Bash:
cat instructions.txt \
| tr -d $'\n' \
| while read -N 4 nibble; do
printf '%x' "$((2#${nibble}))"; \
done \
| xxd -r -p \
> instructions.bin
cat
- innecesario, pero usado para mayor claridad
tr -d $'\n'
- eliminar todas las nuevas líneas de la entrada
read -N 4 nibble
- lee exactamente 4 × caracteres en la nibble
variable
printf '%x' "$((2#${nibble}))"
convierte el mordisco de binario a 1 × carácter hexadecimal
$((2#...))
- convierte el valor dado de base 2 (binario) a base 10 (decimal)
printf '%x'
- formatee el valor dado de base 10 (decimal) a base 16 (hexadecimal)
xxd -r -p
- reverse ( -r
) un volcado simple ( -p
) - de hexadecimal a binario sin formato
Pitón:
python << EOF > instructions.bin
d = '$(cat instructions.txt | tr -d $'\n')'
print(''.join([chr(int(d[i:i+8],2)) for i in range(0, len(d), 8)]))
EOF
- Se utiliza un heredoc (
<< EOF
) sin comillas para obtener contenido en el código de Python
- Esto no es eficiente si la entrada se hace grande
cat
y tr
- se utiliza para obtener una entrada limpia (una línea)
range(0, len(d), 8)
- Obtenga una lista de números desde 0 hasta el final de la cadena d
, paso a paso 8 × caracteres a la vez.
chr(int(d[i:i+8],2))
- convierte el segmento actual ( d[i:i+8]
) de binario a decimal ( int(..., 2)
), y luego a un carácter sin formato ( chr(...)
)
[ x for y in z]
- lista de comprensión
''.join(...)
- convierte la lista de caracteres en una sola cadena
print(...)
- Imprímelo