Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

पैकिंग और अनपैकिंग:रूबी में बाइनरी डेटा पढ़ने के लिए एक गाइड

इस लेख में आप रूबी पैक और अनपैक विधियों के बारे में जानेंगे!

लेकिन हमें इन तरीकों की ज़रूरत क्यों है?

बाइनरी डेटा के साथ काम करने की तुलना में टेक्स्ट के साथ काम करना बहुत आसान है

पाठ आपको उपयोग करने की अनुमति देता है:

  • रेगुलर एक्सप्रेशन
  • विधि जैसे scan &match
  • gsub

लेकिन अगर आप बाइनरी डेटा के साथ काम करना चाहते हैं, तो कुछ अतिरिक्त काम करना होगा। यहीं से Array#pack &String#unpack तरीके चलन में आते हैं।

मैं आपको कुछ उदाहरण दिखाता हूं, केवल एक सादे तार से शुरू करके और फिर और अधिक दिलचस्प चीजों पर आगे बढ़ना।

ASCII मानों के लिए स्ट्रिंग

यह स्ट्रिंग के प्रत्येक वर्ण को दशमलव मान में बदल देगा:

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

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

"c*" पर ध्यान दें unpack . के लिए तर्क ।

यह एक “प्रारूप स्ट्रिंग” है जो unpack tells को बताता है डेटा के साथ क्या करना है। इस मामले में, c इसका मतलब है कि एक वर्ण लें और उसे एक पूर्णांक मान में बदलें (स्ट्रिंग#ऑर्ड विधि भी ऐसा करती है)।

तारांकन * बस "सभी इनपुट डेटा के लिए इस प्रारूप को दोहराएं" कहते हैं।

Hex को स्ट्रिंग में बदलें

H pack . के साथ प्रयोग किया जाता है विधि आपको स्ट्रिंग रूपांतरण के लिए एक हेक्स संख्या देती है।

उदाहरण :

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

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

Hex को पूर्णांक में कैसे बदलें

यह प्रारूप स्ट्रिंग 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 बिट) लंबाई वाला फ़ील्ड होता है जिसमें निम्न स्ट्रिंग की लंबाई होती है। फिर स्ट्रिंग ही है।

बाइनरी फ़ाइलों और बाइनरी नेटवर्क प्रोटोकॉल के लिए "लंबाई" फ़ील्ड होना बहुत आम है।

यह पार्सर को बताता है कि वास्तव में कितने बाइट पढ़े जाने चाहिए

हाँ।

मुझे पता है कि इस उदाहरण में मैंने लंबाई और डेटा दोनों को एक ही चरण में पढ़ा है, बस चीजों को सरल रखने के लिए।

BinData Gem का उपयोग कैसे करें

बिंदता रत्न भी है, जो विशेष रूप से बाइनरी संरचनाओं को पार्स करने में आपकी मदद करने के लिए बनाया गया है।

यहां एक उदाहरण दिया गया है :

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

ध्यान दें read_length पैरामीटर। यह बिंदता को मैदान से लंबाई निकालने के लिए कहेगा, तो इससे आपका बहुत काम बचेगा 🙂

इसलिए यदि आप किसी बाइनरी प्रारूप के लिए पार्सर लिखना चाहते हैं, तो ये चरण हैं:

  1. इस प्रारूप के लिए विनिर्देश खोजें (यदि यह सार्वजनिक नहीं है तो आपको इसे रिवर्स-इंजीनियर करना होगा, जो अपने आप में एक संपूर्ण विषय है)
  2. फ़ाइल के प्रत्येक अनुभाग के लिए एक `bindata` वर्ग लिखें (आप आमतौर पर पहले मेटाडेटा और फिर एकाधिक डेटा अनुभागों के साथ एक शीर्ष लेख अनुभाग पाएंगे)
  3. डेटा को पढ़ें और इसे अपनी इच्छानुसार संसाधित करें (उदाहरण के लिए, पीएनजी में आप छवि के रंग बदल सकते हैं)
  4. लाभ!

अगर आप bindata . का पूरा उदाहरण देखना चाहते हैं कार्रवाई में जीथब पर मेरे पीएनजी पार्सर पर एक नज़र डालें।

Base64 एन्कोडिंग

इस प्रकार का एन्कोडिंग है जिसे "बेस 64" कहा जाता है। आपने इसे पहले किसी URL पर देखा होगा।

ऐसा कुछ दिखता है :

U2VuZCByZWluZm9yY2VtZW50cw==

अंत में डबल बराबर आमतौर पर बताने वाला संकेत है कि आप Base64 के साथ काम कर रहे हैं , हालांकि कुछ इनपुट के परिणामस्वरूप समान चिह्न नहीं हो सकते हैं (वे पैडिंग के रूप में उपयोग किए जाते हैं)।

तो मैं आपको यह क्यों बता रहा हूं…

अपने आप में एक उपयोगी चीज़ होने के अलावा?

खैर, यह पता चला है कि आप एक स्ट्रिंग को Base64 . में बदल सकते हैं pack . का उपयोग करना विधि।

जैसा कि आप यहां देख सकते हैं :

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

encode64 "abcd"

# "YWJjZA==\n"

वास्तव में, यह Base64 . में उपयोग की जाने वाली सटीक विधि है मानक पुस्तकालय से मॉड्यूल।

सारांश

इस पोस्ट में, आपने pack . के बारे में सीखा &unpack तरीके, जो आपको बाइनरी डेटा के साथ काम करने में मदद करते हैं। आप इसका उपयोग बाइनरी फ़ाइलों को पार्स करने, स्ट्रिंग को ASCII मानों में बदलने और बेस 64 एन्कोडिंग के लिए कर सकते हैं।

साझा और सदस्यता लेना न भूलें ताकि आप इस तरह के और ब्लॉग पोस्ट का आनंद उठा सकें!


  1. रूबी डेवलपर्स के लिए डेटा संरचनाओं का अवलोकन

    डेटा संरचना क्या है? डेटा संरचना डेटा को व्यवस्थित और एक्सेस करने का एक विशिष्ट तरीका है । उदाहरणों में शामिल हैं: सरणी बाइनरी ट्री हैश विभिन्न डेटा संरचनाएं अलग-अलग कार्यों में उत्कृष्ट होती हैं। उदाहरण के लिए, यदि आप शब्दकोश (शब्द और परिभाषा), या फ़ोन बुक (व्यक्ति का नाम और संख्या) जैसा दिखन

  1. रूबी में इनपुट और आउटपुट (आईओ):निश्चित गाइड

    I/O का मतलब इनपुट/आउटपुट है। इनपुट से हमारा मतलब उन सभी डेटा और सूचनाओं से है जो किसी चीज़ में आती हैं (कंप्यूटर, रूबी विधि, आपका दिमाग)। इनपुट के उदाहरण : कीबोर्ड पर आपके प्रेस की कुंजी माउस क्लिक आपके द्वारा पढ़ी जाने वाली पुस्तकें आउटपुट से हमारा मतलब वह सब कुछ है जो इनपुट के परिणामस्वरूप नि

  1. रूबी में कार्यात्मक प्रोग्रामिंग (पूर्ण गाइड)

    हो सकता है कि आपने अभी कार्यात्मक प्रोग्रामिंग के बारे में सुना हो और आपके कुछ प्रश्न हों। लाइक... कार्यात्मक प्रोग्रामिंग वास्तव में क्या है? यह ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से कैसे तुलना करता है? क्या आपको रूबी में कार्यात्मक प्रोग्रामिंग का उपयोग करना चाहिए? आइए मैं आपके लिए इन सवालों के जव