আমার মূল উত্তর ভুল ছিল - 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- বিপরীত ( -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(...) - এটা ছাপাও