Benim asıl cevap yanlıştı - xxd
Ya kabul edemez -p
ya da -r
birlikte -b
...
Diğer cevapların uygulanabilir olduğunu ve “ başka bir şekilde ” çıkarsa, aşağıdakilere ne dersiniz:
Giriş
$ cat instructions.txt
00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011
Çıktı
$ 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 boru hattı:
cat instructions.txt \
| tr -d $'\n' \
| while read -N 4 nibble; do
printf '%x' "$((2#${nibble}))"; \
done \
| xxd -r -p \
> instructions.bin
cat
- Gereksiz, ancak netlik için kullanılır
tr -d $'\n'
- tüm yeni satırları girişten kaldır
read -N 4 nibble
- değişkene tam 4 × karakter okunibble
printf '%x' "$((2#${nibble}))"
ucu ikilikten 1 × hex karaktere dönüştürün
$((2#...))
- verilen değeri taban 2'den (ikili) taban 10'a (ondalık) dönüştürün
printf '%x'
- verilen değeri taban 10'dan (ondalık) taban 16'ya (onaltılık) biçimlendirin
xxd -r -p
- reverse ( -r
), düz bir dökümü ( -p
) - onaltılıktan ham ikiliye
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
- Tırnak içine alınmamış heredoc (
<< EOF
) Python koduna içeriği almak için kullanılır
- Giriş büyük olursa bu etkili olmaz
cat
ve tr
- temiz (tek satırlık) bir girdi elde etmek için kullanılır
range(0, len(d), 8)
- 0'dan dize kadar olan sayıları içeren bir liste alın d
ve her seferinde 8 × karakter atlayın.
chr(int(d[i:i+8],2))
- geçerli dilimi ( d[i:i+8]
) ikiliden ondalık ( int(..., 2)
) ve daha sonra ham bir karaktere ( chr(...)
) dönüştürür
[ x for y in z]
- liste anlama
''.join(...)
- karakter listesini tek bir dizgeye dönüştür
print(...)
- yazdır