2009-07-28 20 views
10

मैं एक कंपनी के उपयोग के एक विशेष मानक को पूरा करने के लिए, एक सॉकेट में बाइनरी बाइट्स की एक श्रृंखला भेजने की कोशिश कर रहा हूं। मेरी कंपनी में किसी ने भी इसके लिए रूबी का उपयोग नहीं किया है, लेकिन दूसरी भाषाओं में, वे एक समय में डेटा को एक बाइट में भेजते हैं, (आमतौर पर कुछ प्रकार के "पैक" विधि के साथ)।रूबी बाइट्स/बाइनरी को कैसे संभालता है?

मैं फ्लाई पर बाइनरी बनाने के लिए वैसे भी नहीं ढूंढ सकता, या बाइट्स बना सकता हूं (सबसे नज़दीक मैं इसे पा सकता हूं कि आप स्ट्रिंग को अपने वर्णों का प्रतिनिधित्व करने वाले बाइट्स में कैसे बदल सकते हैं)।

मैं आप कह सकते हैं बताती है कि कुछ की तरह:

@var = 0b101010101

लेकिन यह कैसे मैं फार्म "101,010,101" या बनाया जब मैं string.to_i करना जिसके परिणामस्वरूप पूर्णांक में एक स्ट्रिंग बदल जाएगा (2) एक वास्तविक बाइनरी में। अगर मैं सिर्फ एक सॉकेट में स्ट्रिंग भेजता हूं, तो क्या वह शाब्दिक पात्रों के बजाय "0" और "1" के लिए ASCII नहीं भेजेगा?

निश्चित रूप से रूबी में ऐसा करने का कोई तरीका है?

उत्तर

10

एक स्ट्रिंग बाइट्स की एक मनमाना अनुक्रम है कि बनाने के लिए, कुछ इस तरह करते हैं:

binary_string = "\xE5\xA5\xBD" 

"\ x" हेक्स से एक मनमाना बाइट एन्कोड करने के लिए है, तो एक विशेष भागने है " \ xE5 "बाइट 0xE5 का मतलब है।

फिर उस स्ट्रिंग को सॉकेट पर भेजने का प्रयास करें।

+0

बाइनरी_स्ट्रिंग में कुछ "/" क्यों हैं? – why

+2

बाइनरी स्ट्रिंग के लिए यह 0x2F (47) मान के साथ बाइट होना संभव है। यह "/" की ASCII एन्कोडिंग है, इसलिए यदि आप स्ट्रिंग का निरीक्षण करते हैं तो रूबी आमतौर पर "/" प्रिंट करेगा। एक ही चीज किसी भी ASCII चरित्र के लिए जाती है। रूबी वास्तव में नहीं जानता है कि आपकी स्ट्रिंग एक "द्विआधारी स्ट्रिंग" है, रूबी के लिए आपकी स्ट्रिंग मूल रूप से बाइट्स का अनुक्रम है (1.9 को छोड़कर उन्होंने कुछ एन्कोडिंग जानकारी जोड़ दी है)। –

+0

धन्यवाद! यह मुझे बहुत मदद करता है – why

9

String.unpack विधि पर एक नज़र डालें।

str = "1010" 
str.unpack("cccc") 
=> [49, 48, 49, 48] 

यह आपको पूर्णांक मूल्यों दे देंगे: यह एक उदाहरण है। रूपांतरण करने के और तरीके हैं।

+0

इस पोस्ट को संपादित करने से पहले, उसने मुझे Array.pack के बारे में बताया। मुझे यह समझ में नहीं आता है। यदि मेरे पास है: @bob = ["111111111", "1000", "1111"] या जो भी हो, और फिर मैं कहता हूं: @ bob.unpack (b *), यह कुछ ऐसा प्रदर्शित करता है: "/ 377" क्या यह सही बाइनरी है? क्या यह केवल सरणी का पहला तत्व नहीं है? मैं इसे पूरी सरणी कैसे करूँगा? – Jenny

+0

Array.pack String.unpack के विपरीत है। आपके उदाहरण में bob.pack ('b *') केवल सरणी के पहले तत्व को पैक कर रहा है। आप शायद bob.pack ('बी * बी * बी *') चाहते हैं। हालांकि यह प्रश्न में आप जो पूछ रहे हैं उससे कुछ अलग है। – kgiannakakis

14

यह नहीं पता कि यह पर्याप्त मदद करता है, लेकिन आप रूबी में एक पूर्णांक में बिट्स को इंडेक्स कर सकते हैं।

n = 0b010101 

n # => 21 

n = 21 

n[0] # => 1 
n[1] # => 0 
n[2] # => 1 
n[3] # => 0 
n[4] # => 1 
n[5] # => 0 
संबंधित मुद्दे