বিটের টেক্সট ফাইলটিকে বাইনারি ফাইলে রূপান্তর করুন


12

instructions.txtবিষয়বস্তু সহ আমার একটি ফাইল রয়েছে:

00000000000000000000000000010011
00000010110100010010000010000011
00000000011100110000001010110011
00000000011100110000010000110011
00000000011100110110010010110011
00000000000000000000000000010011

আমি কীভাবে instructions.binএকই ডেটার বাইনারি ফাইল তৈরি করতে পারি instructions.txt। অন্য কথায় .binফাইলটিতে .txtলাইন প্রতি 32 বিট সহ ফাইলের একই 192 বিট হওয়া উচিত with আমি উবুন্টু লিনাক্সে ব্যাশ ব্যবহার করছি। আমি ব্যবহার করার চেষ্টা করছিলাম xxd -b instructions.txtতবে আউটপুটটি 192 বিটের চেয়ে অনেক বেশি দীর্ঘ।

উত্তর:


6

অনেলাইনার 32 টি-বিট স্ট্রিংগুলি এবং শূন্যগুলিকে সংশ্লিষ্ট বাইনারিতে রূপান্তর করতে:

$ perl -ne 'print pack("B32", $_)' < instructions.txt > instructions.bin

এর মানে কি:

  • perl -neSTDIN ( instructions.txt) এ সরবরাহ করা প্রতিটি ইনপুট ফাইলের মধ্য দিয়ে পুনরাবৃত্তি হবে
  • pack("B32", $_)32 টি বিটের একটি স্ট্রিং তালিকা নেবে ( $_যা আমরা কেবল এসটিডিআইএন থেকে পড়েছি) এবং এটি বাইনারি মানতে রূপান্তরিত করব (আপনি বিকল্পভাবে ব্যবহার করতে পারেন "b32"যদি প্রতিটি বাইটের ভিতরে বিট অর্ডার অবতরণ করার পরিবর্তে আরোহণ বিট ক্রম চান; perldoc -f packআরও বিশদ দেখুন)
  • print তারপরে আউটপুট যা STDOUT এ রূপান্তরিত হবে, যা আমরা আমাদের বাইনারি ফাইলে পুনঃনির্দেশ করি instructions.bin

যাচাই:

$ 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

$ xxd -b -c4 instructions.bin
00000000: 00000000 00000000 00000000 00010011  ....
00000004: 00000010 11010001 00100000 10000011  .. .
00000008: 00000000 01110011 00000010 10110011  .s..
0000000c: 00000000 01110011 00000100 00110011  .s.3
00000010: 00000000 01110011 01100100 10110011  .sd.
00000014: 00000000 00000000 00000000 00010011  ....

8

যোগ করা হচ্ছে -rবিকল্প (রিভার্স মোড) xxd -bনা আসলে উদ্দীষ্ট হিসাবে কাজ করে কারণ xxd যাও কেবল এই দুটি পতাকা মিশ্রন সমর্থন করে না (এটা উপেক্ষা করে -bউভয় দেওয়া হয়)। পরিবর্তে, আপনাকে প্রথমে বিটগুলি হেক্সে রূপান্তর করতে হবে। উদাহরণস্বরূপ:

( echo 'obase=16;ibase=2'; sed -Ee 's/[01]{4}/;\0/g' instructions.txt ) | bc | xxd -r -p > instructions.bin

সম্পূর্ণ ব্যাখ্যা:

  • প্রথম বন্ধনের অভ্যন্তরের অংশটি একটি bcস্ক্রিপ্ট তৈরি করে । এটি প্রথমে ইনপুট বেসটিকে বাইনারি (2) এবং আউটপুট বেসকে হেক্সাডেসিমাল (16) এ সেট করে। এর পরে, sedকমান্ডটি instructions.txt4 টি বিটের প্রতিটি গ্রুপের মধ্যে একটি সেমিকোলন সহ সামগ্রীগুলি মুদ্রণ করে , যা 1 হেক্স অঙ্কের সাথে মিলে যায়। ফলাফল পাইপ করা হয় bc
  • সেমিকোলন একটি কমান্ড বিভাজক bc, সুতরাং সমস্ত স্ক্রিপ্ট হ'ল প্রতিটি ইনপুট পূর্ণসংখ্যার পিছনে আউট (বেস রূপান্তরের পরে) মুদ্রণ করা হয়।
  • এর আউটপুট bcহেক্স ডিজিটের ক্রম, যা সাধারণের সাথে কোনও ফাইলে রূপান্তর করা যায় xxd -r -p

আউটপুট:

$ 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
$ xxd -b -c4 instructions.bin
00000000: 00000000 00000000 00000000 00010011  ....
00000004: 00000010 11010001 00100000 10000011  .. .
00000008: 00000000 01110011 00000010 10110011  .s..
0000000c: 00000000 01110011 00000100 00110011  .s.3
00000010: 00000000 01110011 01100100 10110011  .sd.
00000014: 00000000 00000000 00000000 00010011  ....

দুঃখিত, এর মধ্যে এখনও একটি চূড়ান্ততা বাগ রয়েছে। এটি ঠিক করার কাজ!
যাযাবর টাইপ

1
আসলে, এটা ঠিক আছে। আমি সর্বশেষ xxd কমান্ডে ভুল আউটপুট প্রস্থ ব্যবহার করে বিভ্রান্ত হয়ে পড়েছিলাম।
যাযাবর টাইপ

1
আমি স্ক্রিপ্ট পরীক্ষিত করেছি এবং এটা কিন্তু আউটপুট কাজ করে: (standard_in) 1: syntax error। আপনি syntax errorএটি ব্যাখ্যা করতে পারেন যা এটি উল্লেখ করছে বা কেন এটি ঘটে? আপনার মেশিনেও কি এটি ঘটে?
ডোপামনে

2

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

1
দ্রষ্টব্য: অনেকগুলি শেল |লাইনের শেষে ব্যাকস্ল্যাশের মতো কাজ করে: কমান্ডটি পরবর্তী লাইনে অবিরত থাকে। এইভাবে আপনি কয়েকটি ব্যাকস্ল্যাশ থেকে মুক্তি পেতে পারেন। আমি নিশ্চিত নই যে এলএফ-র পরে পাইপ প্রতীক ব্যবহার করা আপনার জ্ঞাত সিদ্ধান্ত ছিল। আপনি না জানলে আমি অন্যভাবে উল্লেখ করছি।
কামিল ম্যাকিয়েরোস্কি

1
আমি জানতাম না, ধন্যবাদ! আমি পাইপলাইনটিকে লজিকাল লাইনে ভাঙ্গা এবং পাইপগুলি |(বা পুনর্নির্দেশগুলি >, বুলিয়ান অপারেটর &&, ইত্যাদি ...) সামনে দৃশ্যমানতা / স্পষ্টতার জন্য স্পষ্টরূপে রাখা সম্ভবত সম্ভবত একটি স্টাইলিস্টিক / পছন্দসই জিনিস হিসাবে পছন্দ করি।
Attie

1
কিছু চিন্তা করার পর আমি এই শৈলী ব্যবহার করে আপনি একটি পরীক্ষা দ্বারা বলতে পারেন কারণ দুই লাইন সংযুক্ত করা হয়, শুরু হতে পারে কোনো তাদের। যদি |শেষের দিকে থাকে তবে পরবর্তী লাইনটি স্ট্যান্ডেলোন কমান্ডের মতো দেখতে এটি বিভ্রান্তিকর হতে পারে। এই কারণেই আমি ভেবেছিলাম শৈলীটি আপনার জ্ঞাত সিদ্ধান্ত হতে পারে।
কামিল ম্যাকিয়েরোভস্কি

দুর্দান্ত, আমাকে কীভাবে এটি যেতে দেয় তা জানতে দিন :-)
এট্টি


1

আপনি এটি কোডগল্ফ এসই সাইটে পোস্ট করার চেষ্টা করতে পারেন, তবে এখানে আমার বিকল্প পাইথন সংস্করণ (কেবল কিক চ্যালেঞ্জের জন্য):

python -c "import sys,struct;[sys.stdout.buffer.write(struct.pack('!i',int(x,2)))for x in sys.stdin]" \
< input.txt > output.bin

ধরে নেওয়া input.txtআপনার ডেটা ধারণ করে এবং এটি প্রতি লাইনে 32 টি অক্ষরে ফর্ম্যাট করা হয়।

এটি পাইথন 3 ব্যবহার করে struct প্যাকেজ এবং স্টিডিন / আউট থেকে লেখার / পঠন করে। (পাইথন 2 এ এটি আরও কম হত)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.