คำตอบเดิมของฉันไม่ถูกต้อง - 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(...) - พิมพ์