কম্পিউটার

প্যাকিং এবং আনপ্যাকিং:রুবিতে বাইনারি ডেটা পড়ার জন্য একটি গাইড

এই নিবন্ধে আপনি রুবি প্যাক এবং আনপ্যাক পদ্ধতি সম্পর্কে শিখবেন!

কিন্তু কেন আমাদের এই পদ্ধতির প্রয়োজন?

বাইনারি ডেটা দিয়ে কাজ করার চেয়ে পাঠ্যের সাথে কাজ করা অনেক সহজ .

পাঠ্য আপনাকে ব্যবহার করতে দেয়:

  • রেগুলার এক্সপ্রেশন
  • পদ্ধতি যেমন scan &match
  • gsub

কিন্তু আপনি যদি বাইনারি ডেটা নিয়ে কাজ করতে চান তবে কিছু অতিরিক্ত কাজ করতে হবে। এখানেই অ্যারে#প্যাক এবং স্ট্রিং#আনপ্যাক পদ্ধতিগুলি কার্যকর হয়৷

আমি আপনাকে কিছু উদাহরণ দেখাই, শুধুমাত্র একটি সাধারণ স্ট্রিং দিয়ে শুরু করে এবং তারপরে আরও আকর্ষণীয় জিনিসগুলিতে চলে যাই।

ASCII মানগুলিতে স্ট্রিং

এটি স্ট্রিং-এর প্রতিটি অক্ষরকে দশমিক মানের মধ্যে রূপান্তর করবে:

str = "AABBCC"
str.unpack("c*")

# [65, 65, 66, 66, 67, 67]

"c*" লক্ষ্য করুন unpack এর জন্য যুক্তি .

এটি একটি "ফরম্যাট স্ট্রিং" যা unpack বলে ডেটা দিয়ে কি করতে হবে। এই ক্ষেত্রে, c মানে একটি অক্ষর নিন এবং এটিকে একটি পূর্ণসংখ্যা মানতে রূপান্তর করুন (স্ট্রিং#অর্ড পদ্ধতিও এটি করে)।

তারকাচিহ্ন * শুধু বলে "সমস্ত ইনপুট ডেটার জন্য এই বিন্যাসটি পুনরাবৃত্তি করুন"৷

হেক্সকে স্ট্রিং-এ রূপান্তর করুন

H pack এর সাথে ব্যবহৃত পদ্ধতি আপনাকে স্ট্রিং রূপান্তরের জন্য একটি হেক্স নম্বর দেয়৷

উদাহরণ :

["414243"].pack("H*")
# "ABC"

"ABC".unpack("H*")
# ["414243"]

কিভাবে হেক্সকে পূর্ণসংখ্যাতে রূপান্তর করতে হয়

এই ফর্ম্যাট স্ট্রিংটি 4 বাইট ডেটা নেয় এবং একটি পূর্ণসংখ্যা প্রদান করে। একটি বিষয় লক্ষ্য করুন যে এই বাইটগুলি "লিটল-এন্ডিয়ান" ফর্ম্যাটে রয়েছে৷

উদাহরণ :

"\xff\x00\x00\x00".unpack("l").first
# 255
"\x90\xC0\xDD\x08".unpack("l").first
# 148750480

আমি first ব্যবহার করেছি এখানে কারণ unpack একটি অ্যারে প্রদান করে।

আনপ্যাক পদ্ধতির সাথে বাইনারি ফাইল পার্সিং

আপনি কিভাবে একটি EXE, PNG বা GZIP এর মত একটি বাইনারি ফাইল পড়বেন?

আপনি যদি এই ফাইলগুলিকে প্লেইন টেক্সটের মতো পড়েন, তাহলে আপনি এমন কিছু দেখতে পাবেন যা র্যান্ডম ডেটার মতো দেখাচ্ছে…

প্যাকিং এবং আনপ্যাকিং:রুবিতে বাইনারি ডেটা পড়ার জন্য একটি গাইড

এটা এলোমেলো জিনিস নয়।

একটি নথিভুক্ত কাঠামো আছে এই ফাইল ফরম্যাটের অনেকের জন্য এবং unpack পদ্ধতি হল যা আপনি সেই ডেটা পড়তে এবং এটিকে দরকারী কিছুতে রূপান্তর করতে ব্যবহার করতে পারেন৷

এখানে একটি উদাহরণ :

binary_data     = "\x05\x00\x68\x65\x6c\x6c\x6f"
length, message = binary_data.unpack("Sa*")

# [5, "hello"]

এই উদাহরণে, বাইনারি ডেটা (হেক্সাডেসিমেলে উপস্থাপিত, যা 1s এবং 0s এর চেয়ে অনেক বেশি কম্প্যাক্ট) এর একটি দুই-বাইট (16 বিট) দৈর্ঘ্যের ক্ষেত্র রয়েছে যা নিম্নলিখিত স্ট্রিংটির দৈর্ঘ্য ধারণ করে। তারপর স্ট্রিং নিজেই আছে।

বাইনারি ফাইল এবং বাইনারি নেটওয়ার্ক প্রোটোকলের জন্য একটি "দৈর্ঘ্য" ক্ষেত্র থাকা খুবই সাধারণ।

এটি পার্সারকে ঠিক কতগুলি বাইট পড়তে হবে তা বলে .

হ্যাঁ৷

আমি জানি এই উদাহরণে আমি এক ধাপে দৈর্ঘ্য এবং ডেটা উভয়ই পড়েছি, এটি কেবল জিনিসগুলি সহজ রাখার জন্য।

কিভাবে বিনডেটা রত্ন ব্যবহার করবেন

এছাড়াও বিন্দাতা রত্ন রয়েছে, যা আপনাকে বাইনারি স্ট্রাকচার পার্স করতে সাহায্য করার জন্য বিশেষভাবে তৈরি করা হয়েছে।

এখানে একটি উদাহরণ :

class BinaryString < BinData::Record
  endian :little
  uint16 :len
  string :name, :read_length => :len
end

read_length লক্ষ্য করুন প্যারামিটার এটি বিন্দাতাকে ক্ষেত্র থেকে দৈর্ঘ্য বের করতে বলবে, তাই এটি আপনাকে অনেক কাজ বাঁচাবে 🙂

সুতরাং আপনি যদি কোনো বাইনারি বিন্যাসের জন্য একটি পার্সার লিখতে চান, এই ধাপগুলি হল:

  1. এই ফরম্যাটের জন্য স্পেসিফিকেশন খুঁজুন (যদি এটি সর্বজনীন না হয় তাহলে আপনাকে এটিকে রিভার্স-ইঞ্জিনিয়ার করতে হবে, যা সম্পূর্ণ বিষয় নিজস্ব)
  2. ফাইলের প্রতিটি বিভাগের জন্য একটি `bindata` ক্লাস লিখুন (আপনি সাধারণত মেটাডেটা সহ প্রথমে একটি শিরোনাম বিভাগ এবং তারপর একাধিক ডেটা বিভাগ পাবেন)
  3. ডেটা পড়ুন এবং আপনি যেভাবে চান তা প্রক্রিয়া করুন (উদাহরণস্বরূপ, একটি PNG তে আপনি ছবির রঙ পরিবর্তন করতে পারেন)
  4. লাভ!

আপনি যদি bindata এর সম্পূর্ণ উদাহরণ দেখতে চান অ্যাকশনে গিথুবে আমার পিএনজি পার্সারটি দেখুন৷

বেস64 এনকোডিং

এই ধরনের এনকোডিং আছে যাকে "Base64" বলা হয়। আপনি এটি একটি URL-এ আগে দেখে থাকতে পারেন৷

এরকম কিছু দেখাচ্ছে৷ :

U2VuZCByZWluZm9yY2VtZW50cw==

শেষে ডবল সমান হয় সাধারণত টেল-টেল চিহ্ন যে আপনি Base64 নিয়ে কাজ করছেন , যদিও কিছু ইনপুট এর ফলে সমান চিহ্নগুলি সেখানে নেই (এগুলি প্যাডিং হিসাবে ব্যবহৃত হয়)।

তাহলে আমি তোমাকে কেন বলছি...

নিজে নিজে জানার জন্য একটি দরকারী জিনিস হওয়া ছাড়াও?

ঠিক আছে, দেখা যাচ্ছে যে আপনি একটি স্ট্রিংকে Base64 এ রূপান্তর করতে পারেন pack ব্যবহার করে পদ্ধতি।

যেমন আপনি এখানে দেখতে পাচ্ছেন৷ :

def encode64(bin)
  [bin].pack("m")
end

encode64 "abcd"

# "YWJjZA==\n"

প্রকৃতপক্ষে, এটি Base64-এ ব্যবহৃত সঠিক পদ্ধতি স্ট্যান্ডার্ড লাইব্রেরি থেকে মডিউল।

সারাংশ

এই পোস্টে, আপনি pack সম্পর্কে শিখেছেন &unpack পদ্ধতি, যা আপনাকে বাইনারি ডেটা নিয়ে কাজ করতে সাহায্য করে। আপনি বাইনারি ফাইল পার্স করতে, একটি স্ট্রিংকে ASCII মানগুলিতে রূপান্তর করতে এবং Base64 এনকোডিংয়ের জন্য এটি ব্যবহার করতে পারেন৷

শেয়ার এবং সাবস্ক্রাইব করতে ভুলবেন না তাই আপনি এই মত আরো ব্লগ পোস্ট উপভোগ করতে পারেন! 🙂


  1. রুবিতে ব্যতিক্রমগুলিতে প্রসঙ্গ ডেটা কীভাবে যুক্ত করবেন

  2. রুবি ডেভেলপারদের জন্য ডেটা স্ট্রাকচারের একটি ওভারভিউ

  3. ইনপুট ও আউটপুট (IO) রুবিতে:দ্য ডেফিনিটিভ গাইড

  4. রুবিতে কার্যকরী প্রোগ্রামিং (সম্পূর্ণ নির্দেশিকা)