Jawaban asli saya salah - xxd
tidak dapat menerima -p
atau -r
dengan -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 nibble
variabel
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
cat
dan 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