คำตอบเดิมของฉันไม่ถูกต้อง - 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
ไปป์ไลน์:
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
- reverse ( -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
- unquoted heredoc (
<< EOF
) ถูกนำมาใช้เพื่อให้ได้เนื้อหาลงในรหัสหลาม
- สิ่งนี้ไม่มีประสิทธิภาพถ้าอินพุตมีขนาดใหญ่
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(...)
- พิมพ์