Jawaban asli saya salah - xxdtidak dapat menerima -patau -rdengan -b...
Mengingat bahwa jawaban lain bisa diterapkan, dan untuk kepentingan " cara lain ", bagaimana dengan yang berikut:
Memasukkan
$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Keluaran
$ 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 pipeline:
cat instructions.txt \
| tr -d $'\n' \
| while read -N 4 nibble; do
printf '%x' "$((2#${nibble}))"; \
done \
| xxd -r -p \
> instructions.bin
cat - tidak perlu, tetapi digunakan untuk kejelasan
tr -d $'\n' - hapus semua baris baru dari input
read -N 4 nibble- baca persis 4 × karakter ke dalam nibblevariabel
printf '%x' "$((2#${nibble}))" mengkonversi nibble dari binary ke 1 × hex karakter
$((2#...)) - Konversi nilai yang diberikan dari basis 2 (biner) ke basis 10 (desimal)
printf '%x' - memformat nilai yang diberikan dari basis 10 (desimal) ke basis 16 (heksadesimal)
xxd -r -p- membalikkan ( -r) dump biasa ( -p) - dari heksadesimal ke biner mentah
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 ( ) yang tidak dikutip
<< EOF digunakan untuk mendapatkan konten ke dalam kode Python
- Ini tidak efisien jika inputnya menjadi besar
catdan tr- digunakan untuk mendapatkan input (satu baris) yang bersih
range(0, len(d), 8) - dapatkan daftar angka dari 0 hingga akhir string d , melangkah 8 × karakter sekaligus.
chr(int(d[i:i+8],2))- Konversi irisan saat ini ( d[i:i+8]) dari biner ke desimal ( int(..., 2)), dan kemudian ke karakter mentah ( chr(...))
[ x for y in z]- Pemahaman daftar
''.join(...) - Konversi daftar karakter menjadi satu string
print(...) - cetak ini