2012-12-10 58 views
5

के रूप में संदेश की लंबाई का प्रतिनिधित्व कैसे करें मैं रूबी का उपयोग कर रहा हूं और मैं नेटवर्क एंडपॉइंट के साथ संचार कर रहा हूं जिसके लिए संदेश भेजने से पहले 'हेडर' के स्वरूपण की आवश्यकता है।रूबी - 2 बाइनरी बाइट्स

शीर्षलेख में पहला फ़ील्ड संदेश लंबाई होना चाहिए जिसे नेटवर्क बाइट ऑर्डर में 2 बाइनरी बाइट संदेश लंबाई के रूप में परिभाषित किया जाना चाहिए।

उदाहरण के लिए, मेरा संदेश 1024 लंबाई है। मैं बाइनरी दो-बाइट्स के रूप में 1024 का प्रतिनिधित्व कैसे करूं?

उत्तर

5

रूबी (और पर्ल और पायथन और ...) में बाइट wrangling के लिए मानक उपकरण pack और unpack हैं। रुबी का pack is in Array। आप लंबाई है कि दो बाइट्स लंबे और नेटवर्क बाइट क्रम में होना चाहिए, कि n फॉर्मेट स्पेसिफायर के लिए एक नौकरी की तरह लगता है है:

n | इंटीजर | 16-बिट अहस्ताक्षरित, नेटवर्क (बड़े endian) बाइट क्रम

तो अगर लंबाई length में है, तो आप अपने दो बाइट्स प्राप्त होता thusly: आप विपरीत करने के लिए की जरूरत है

two_bytes = [ length ].pack('n') 

length = two_bytes.unpack('n').first 
4

देखें Array#pack:, String#unpack पर एक नजर है।

[1024].pack("n") 

इस नेटवर्क से आदेश बाइट क्रम \x04\x00 के रूप में संख्या पैक।

यह काम करता है कि प्रत्येक बाइट 8 बाइनरी बिट्स है। बाइनरी में 1024 10000000000 है। यदि हम इसे 8 (8 बिट्स प्रति बाइट) के ऑक्टेट में तोड़ते हैं, तो हमें मिलता है: 00000100 00000000

एक बाइट प्रतिनिधित्व कर सकता है (2 राज्य)^(8 पद) = 256 अद्वितीय मूल्य। हालांकि, चूंकि हमारे पास 256 एएससीआई-प्रिंट करने योग्य पात्र नहीं हैं, इसलिए हम हेक्साडेसिमल जोड़े के रूप में बाइट्स का प्रतिनिधित्व करते हैं, क्योंकि हेक्साडेसिमल अंक 16 अलग-अलग मानों और 16 * 16 = 256 का प्रतिनिधित्व कर सकता है। इस प्रकार, हम पहले बाइट, 00000100 और ब्रेक ले सकते हैं यह दो हेक्साडेसिमल क्वाड में 0000 0100 के रूप में है। हेनिक्स में बाइनरी अनुवाद करना हमें 0x04 देता है। दूसरा बाइट छोटा है, 0000 00000x00 है। यह हमें दो बाइट स्ट्रिंग का हेक्साडेसिमल प्रतिनिधित्व देता है।

यह ध्यान देने योग्य है कि क्योंकि आप एक 2-बाइट (16-बिट) शीर्षक के लिए विवश कर रहे हैं, तो आप 11111111 11111111 की एक अधिकतम मूल्य, या 2^16 तक ही सीमित हैं लायक है - 1 = 65535 बाइट्स। इससे बड़ा कोई भी संदेश दो बाइट्स में इसकी लंबाई का सटीक रूप से प्रतिनिधित्व नहीं कर सकता है।