Câu trả lời ban đầu của tôi không chính xác - xxd
không thể chấp nhận -p
hoặc -r
với -b
...
Cho rằng các câu trả lời khác là hoàn toàn khả thi, và vì lợi ích của " cách khác ", làm thế nào về những điều sau đây:
Đầu vào
$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Đầu ra
$ 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
Đường ống Bash:
cat instructions.txt \
| tr -d $'\n' \
| while read -N 4 nibble; do
printf '%x' "$((2#${nibble}))"; \
done \
| xxd -r -p \
> instructions.bin
cat
- không cần thiết, nhưng được sử dụng cho rõ ràng
tr -d $'\n'
- xóa tất cả các dòng mới từ đầu vào
read -N 4 nibble
- đọc chính xác 4 × ký tự vào nibble
biến
printf '%x' "$((2#${nibble}))"
chuyển đổi nibble từ nhị phân sang ký tự 1 × hex
$((2#...))
- chuyển đổi giá trị đã cho từ cơ sở 2 (nhị phân) sang cơ sở 10 (thập phân)
printf '%x'
- định dạng giá trị đã cho từ cơ sở 10 (thập phân) sang cơ sở 16 (thập lục phân)
xxd -r -p
- đảo ngược ( -r
) một bãi chứa đơn giản ( -p
) - từ hệ thập lục phân sang nhị phân thô
Con trăn
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
- Một heredoc (
<< EOF
) không được trích dẫn được sử dụng để đưa nội dung vào mã Python
- Điều này không hiệu quả nếu đầu vào trở nên lớn
cat
và tr
- được sử dụng để có đầu vào sạch (một dòng)
range(0, len(d), 8)
- nhận danh sách các số từ 0 đến cuối chuỗi d
, bước 8 × ký tự một lần.
chr(int(d[i:i+8],2))
- chuyển đổi lát cắt hiện tại ( d[i:i+8]
) từ nhị phân sang thập phân ( int(..., 2)
), sau đó chuyển sang ký tự thô ( chr(...)
)
[ x for y in z]
- hiểu danh sách
''.join(...)
- chuyển đổi danh sách các ký tự thành một chuỗi
print(...)
- in nó