私の元の答えは間違っていました- 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
- 正確に 4x文字をnibble
変数に読み込みます
printf '%x' "$((2#${nibble}))"
ニブルをバイナリから1×16進文字に変換します
$((2#...))
-指定された値を基数2(バイナリ)から基数10(10進数)に変換します
printf '%x'
-指定された値を10進数(10進数)から16進数(16進数)にフォーマットします
xxd -r -p
-リバース(-r
)プレーンダンプ(-p
)-16進数からrawバイナリへ
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(
<< EOF
)は、Pythonコードにコンテンツを取得するために使用されます
cat
およびtr
-クリーンな(1行の)入力を取得するために使用
range(0, len(d), 8)
-0から文字列の末尾までの数字のリストを取得d
し、一度に8文字ずつステップします。
chr(int(d[i:i+8],2))
-現在のスライス(d[i:i+8]
)を2進数から10進数(int(..., 2)
)に変換し、次に生の文字(chr(...)
)に変換します
[ x for y in z]
- リストの理解
''.join(...)
-文字のリストを単一の文字列に変換します
print(...)
-印刷する