2013-02-16 17 views
5

मेरे पास 3 स्ट्रिंग्स की एक पैक स्ट्रिंग है जो कि इस तरह से बनाई गई है ताकि मेरे पास एक पूर्णांक हो, जो अगले आइटम की बाइट लंबाई निर्दिष्ट करे और फिर उस आइटम के बाइट्स और फिर अगले आइटम के बाइटसाइट आदि को निर्दिष्ट करे। जैसे कि किसी ने किया:रूबी स्ट्रिंग # अनपैक

[a.bytesize, a, b.bytesize, b, c.bytesize, c].pack("na*na*na*") 

मैं इसे सरल तरीके से कैसे ठीक से अनपैक कर सकता हूं? इस समस्या का समाधान पर्ल था: है एक आसान

vals = [] 
3.times do 
    size = data.unpack("n").first 
    data.slice!(0, 2) 
    vals << data.unpack("a#{size}").first 
    data.slice!(0, size) 
end 

वहाँ:

my($a, $b, $c) = unpack("(n/a*)3", $data) 

गहरे लाल रंग का है, जो जाहिरा तौर पर समर्थन नहीं करता '/' और खोल में कोष्ठकों के लिए, मैं की तरह कुछ का उपयोग कर रहा इस के लिए रास्ता?

+1

जब तक किसी को यह करने के लिए एक सरल उपाय पाता है, मैं गहरे लाल रंग का है समस्या ट्रैकर पर खोल विस्तार करने के लिए एक सुविधा का अनुरोध बनाने पर विचार होगा, कार्यान्वयन कुछ पर्ल सुविधाओं हो जाता है, तो लगता है कि यह उपयोगी हो सकता है लगता है – Speed

उत्तर

0

मुझे पर्ल समाधान के रूप में आसानी से ऐसा करने का कोई तरीका नहीं दिख रहा है (और सहमत है कि रुबी के पैक/अनपैक कार्यान्वयन में जो जोड़ा गया है उसे पाने के लिए एक फीचर अनुरोध दर्ज करना अच्छा होगा), लेकिन मैं कम से कम प्रदान कर सकता था कम लाइनों में समाधान है कि मदद करता है:

vals = [] 
until data.empty? 
    vals << data.slice!(0, data.slice!(0,2).unpack('n').first.to_i).unpack("a*").first 
end 
0

आप किसी भी गंभीर द्विआधारी डाटा प्रोसेसिंग की जरूरत है, इसके लिए एक रत्न है: http://bindata.rubyforge.org/ मुझे लगता है कि आप इसे का उपयोग करना चाहिए, बजाय फोर्जिंग संयुक्त राष्ट्र चल छोरों unpacks।

आप निश्चित रूप से एक फीचर अनुरोध दर्ज कर सकते हैं और इसे लागू करने की प्रतीक्षा कर सकते हैं, लेकिन मेरा सुझाव है कि आप इसके बजाए बिंदटा मणि का उपयोग करें, जो कि एक बहुत ही मजबूत समाधान आईएमओ है।

1

आईएमएचओ PERL में जितना आसान नहीं है, लेकिन यह कुछ समाधान है जो मैं सुझा सकता हूं।

unpacked = [] 
a, b, c = *unpacked << data.slice!(0, data.slice!(0, 2).unpack('S>').first) \ 
      until data.empty?