Câu trả lời ban đầu của tôi không chính xác - xxdkhông thể chấp nhận -phoặc -rvớ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 nibblebiế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
catvà 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ó