Minha resposta original estava incorreta - xxd
não posso aceitar -p
ou -r
com -b
...
Dado que as outras respostas são viáveis e no interesse de " outra maneira ", que tal o seguinte:
Entrada
$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Resultado
$ 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
Pipeline Bash:
cat instructions.txt \
| tr -d $'\n' \
| while read -N 4 nibble; do
printf '%x' "$((2#${nibble}))"; \
done \
| xxd -r -p \
> instructions.bin
cat
- desnecessário, mas usado para maior clareza
tr -d $'\n'
- remova todas as novas linhas da entrada
read -N 4 nibble
- leia exatamente 4 × caracteres na nibble
variável
printf '%x' "$((2#${nibble}))"
converter a mordidela de binário em 1 × caractere hexadecimal
$((2#...))
- converta o valor fornecido da base 2 (binária) para a base 10 (decimal)
printf '%x'
- formate o valor fornecido da base 10 (decimal) para a base 16 (hexadecimal)
xxd -r -p
- reverse ( -r
) uma lixeira comum ( -p
) - a partir de hexadecimal para binário raw
Pitão:
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
- Um heredoc (
<< EOF
) não citado é usado para obter conteúdo no código Python
- Isso não é eficiente se a entrada se tornar grande
cat
e tr
- usado para obter uma entrada limpa (uma linha)
range(0, len(d), 8)
- obtenha uma lista de números de 0 até o final da string d
, percorrendo 8 × caracteres por vez.
chr(int(d[i:i+8],2))
- converta a fatia atual ( d[i:i+8]
) de binária em decimal ( int(..., 2)
) e depois em um caractere bruto ( chr(...)
)
[ x for y in z]
- compreensão da lista
''.join(...)
- converte a lista de caracteres em uma única string
print(...)
- imprima