Моя оригінальна відповідь була неправильною - 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
Баш трубопровід:
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 << 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
- Гередок без котирування (
<< 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(...)
- роздрукуйте