इस लेख में आप रूबी पैक और अनपैक विधियों के बारे में जानेंगे!
लेकिन हमें इन तरीकों की ज़रूरत क्यों है?
बाइनरी डेटा के साथ काम करने की तुलना में टेक्स्ट के साथ काम करना बहुत आसान है ।
पाठ आपको उपयोग करने की अनुमति देता है:
- रेगुलर एक्सप्रेशन
- विधि जैसे
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
पैरामीटर। यह बिंदता को मैदान से लंबाई निकालने के लिए कहेगा, तो इससे आपका बहुत काम बचेगा 🙂
इसलिए यदि आप किसी बाइनरी प्रारूप के लिए पार्सर लिखना चाहते हैं, तो ये चरण हैं:
- इस प्रारूप के लिए विनिर्देश खोजें (यदि यह सार्वजनिक नहीं है तो आपको इसे रिवर्स-इंजीनियर करना होगा, जो अपने आप में एक संपूर्ण विषय है)
- फ़ाइल के प्रत्येक अनुभाग के लिए एक `bindata` वर्ग लिखें (आप आमतौर पर पहले मेटाडेटा और फिर एकाधिक डेटा अनुभागों के साथ एक शीर्ष लेख अनुभाग पाएंगे)
- डेटा को पढ़ें और इसे अपनी इच्छानुसार संसाधित करें (उदाहरण के लिए, पीएनजी में आप छवि के रंग बदल सकते हैं)
- लाभ!
अगर आप bindata
. का पूरा उदाहरण देखना चाहते हैं कार्रवाई में जीथब पर मेरे पीएनजी पार्सर पर एक नज़र डालें।
Base64 एन्कोडिंग
इस प्रकार का एन्कोडिंग है जिसे "बेस 64" कहा जाता है। आपने इसे पहले किसी URL पर देखा होगा।
ऐसा कुछ दिखता है :
U2VuZCByZWluZm9yY2VtZW50cw==
अंत में डबल बराबर आमतौर पर बताने वाला संकेत है कि आप Base64
के साथ काम कर रहे हैं , हालांकि कुछ इनपुट के परिणामस्वरूप समान चिह्न नहीं हो सकते हैं (वे पैडिंग के रूप में उपयोग किए जाते हैं)।
तो मैं आपको यह क्यों बता रहा हूं…
अपने आप में एक उपयोगी चीज़ होने के अलावा?
खैर, यह पता चला है कि आप एक स्ट्रिंग को Base64
. में बदल सकते हैं pack
. का उपयोग करना विधि।
जैसा कि आप यहां देख सकते हैं :
def encode64(bin) [bin].pack("m") end encode64 "abcd" # "YWJjZA==\n"
वास्तव में, यह Base64
. में उपयोग की जाने वाली सटीक विधि है मानक पुस्तकालय से मॉड्यूल।
सारांश
इस पोस्ट में, आपने pack
. के बारे में सीखा &unpack
तरीके, जो आपको बाइनरी डेटा के साथ काम करने में मदद करते हैं। आप इसका उपयोग बाइनरी फ़ाइलों को पार्स करने, स्ट्रिंग को ASCII मानों में बदलने और बेस 64 एन्कोडिंग के लिए कर सकते हैं।
साझा और सदस्यता लेना न भूलें ताकि आप इस तरह के और ब्लॉग पोस्ट का आनंद उठा सकें!