我原来的答案是不正确的- 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
Bash管道:
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
- 未引用的heredoc(
<< 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(...)
-打印