Мой первоначальный ответ был неверным - xxd
не может принять -p
или -r
с -b
...
Учитывая, что другие ответы работоспособны, и в интересах « другого пути », как насчет следующего:
вход
$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Выход
$ 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
Газопровод Bash:
cat instructions.txt \
| tr -d $'\n' \
| while read -N 4 nibble; do
printf '%x' "$((2#${nibble}))"; \
done \
| xxd -r -p \
> instructions.bin
cat
- ненужная, но используемая для наглядности
tr -d $'\n'
- удалить все новые строки из ввода
read -N 4 nibble
- прочитать ровно 4 × символа в переменную nibble
printf '%x' "$((2#${nibble}))"
преобразует полубайт из двоичного в 1 × шестнадцатеричный символ
$((2#...))
- преобразовать данное значение из базы 2 (двоичная) в базу 10 (десятичная)
printf '%x'
- отформатировать заданное значение от основания 10 (десятичное) до основания 16 (шестнадцатеричное)
xxd -r -p
- обратный (-r
) простой дамп (-p
) - из шестнадцатеричного в необработанный двоичный файл
Python:
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
- Heredoc без кавычек (
<< EOF
) используется для получения содержимого в коде Python
- Это не эффективно, если ввод становится большим
cat
и tr
- используются для получения чистого (однострочного) ввода
range(0, len(d), 8)
- получить список чисел от 0 до конца строки d
, шагая по 8 × символов за раз.
chr(int(d[i:i+8],2))
- преобразовать текущий фрагмент (d[i:i+8]
) из двоичного в десятичное (int(..., 2)
), а затем в необработанный символ (chr(...)
)
[ x for y in z]
- понимание списка
''.join(...)
- преобразовать список символов в одну строку
print(...)
- печатать