2009-06-06 11 views
36

से एक स्ट्रिंग बनाएं, मैं बाइट मान से एक स्ट्रिंग बनाना चाहता हूं।रूबी: बाइट्स

मैं वर्तमान में उपयोग करें:

str = " " 
str[0] = byte 

यह ठीक काम करने के लिए लगता है, लेकिन मैं यह बदसूरत और बहुत 1 चरित्र से अधिक समय तार के लिए स्केलेबल नहीं मिल रहा।

कोई विचार?

उत्तर

51

उपरोक्त में से किसी भी की तुलना में एक बहुत ही सरल दृष्टिकोण है: Array#pack:

>> [65,66,67,68,69].pack('c*') 
=> "ABCDE" 

मेरा मानना ​​है कि पैक मैट रूबी में सी में लागू किया गया है, इसलिए यह भी बहुत बड़े सरणी के साथ काफी तेज होगा।

इसके अलावा, पैक 'यू *' टेम्पलेट का उपयोग करके यूटीएफ -8 को सही ढंग से संभाल सकता है।

+0

यह उत्तर ऐसा करने का सही तरीका बताता है। लेकिन रूबी 1.9 में एन्कोडिंग को सही ढंग से सेट करने के लिए याद रखें! – severin

+8

आपको लोअरकेस 'सी *' के साथ 'भाग्यशाली' मिला। आप वास्तव में 'सी *' चाहते हैं। देखें: http://www.ruby-doc.org/core-1.9.3/Array.html 'c'" 8-बिट हस्ताक्षरित (हस्ताक्षरित चार) "के लिए है, 'सी'" 8-बिट हस्ताक्षरित (हस्ताक्षर किए गए चार) " –

+4

पैक" यू * "टेम्पलेट का उपयोग करके यूटीएफ -8 को सही तरीके से संभाल नहीं सकता है। यह गलत है। "यू *" यूटीएफ 8 बाइट्स नहीं, यूनिकोड कोडपॉइंट्स की एक सरणी पैक करता है। – stephenjudkins

3

तो बाइट्स Fixnum के की एक सरणी है तो आप इस कोशिश कर सकते:

bytes.map {|num| num.chr}.join 

या इस:

s = '' 
bytes.each {|i| s << i} 
5
अगर वहाँ एक भी समारोह है कि करता है

याद नहीं कर सकते कि:

>> a = [65,66,67] 
=> [65, 66, 67] 
>> a.map {|x| x.chr}.join 
=> "ABC" 
+0

नाइस, chr विधि –

+0

@VincentRobert के बारे में पता नहीं था आप/तुम उस शैली में इस उदाहरण कर सकते हैं कर सकते हैं कैसे? '[1 9 51,164] .pack ('c *')। Force_encoding ('UTF-8')' –

+0

समझ गया: '[1 9 51,164] .map {| x | x.chr} .join.force_encoding ('UTF-8') ' –

15
1.9 के लिए

आप की जरूरत:

[195,164].pack('c*').force_encoding('UTF-8') 
+8

के लिए एकमात्र कारण है, मैं 'सी *' का उपयोग करने की सलाह देता हूं क्योंकि आप हस्ताक्षरित पूर्णांक चाहते हैं। 'c *' हस्ताक्षरित पूर्णांक के लिए है। ध्यान दें कि: "" ä ".unpack ('c *')' == '[-61, -92]'। आप जो चाहते हैं वह है: '" ä ".unpack ('सी *')' == '[1 9, 164]' –

संबंधित मुद्दे