2010-04-12 7 views
105

में बेस 64 एन्कोडेड स्ट्रिंग में अजीब \ n रूबी में अंतर्निहित बेस 64 लाइब्रेरी कुछ '\ n है। मैं कारण खोजने में असमर्थ हूं। इस विशेष उदाहरण के लिए:रूबी

irb(main):001:0> require 'rubygems' 
=> true 
irb(main):002:0> require 'base64' 
=> true 
irb(main):003:0> str = "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054" 
=> "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054" 
irb(main):004:0> Base64.encode64(str) 
=> "MTExMC0tYWQ2Y2EwYjA2ZTFmYmViN2U2NTE4YTA0MThhNzNhNmUwNGE2NzA1\nNA==\n" 

\ n की आखिरी और 6 वीं स्थिति अंत से है। डिकोडर (Base64.decode64) पुरानी स्ट्रिंग को पूरी तरह वापस देता है। अजीब चीज यह है कि, \ n एन्कोडेड स्ट्रिंग में कोई मान नहीं जोड़ता है। जब मैं आउटपुट स्ट्रिंग से न्यूलाइन हटा देता हूं, तो डिकोडर इसे फिर से पूरी तरह से डीकोड करता है।

इस के
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str 
=> true 

अधिक, मैं एक एक और जे एस पुस्तकालय का इस्तेमाल किया base64 इनकोडिंग एक ही इनपुट स्ट्रिंग के उत्पादन का उत्पादन करने के लिए, उत्पादन के बिना \ N के लिए आता है।

क्या यह एक बग या कुछ और है? क्या किसी को इस मुद्दे का सामना करना पड़ा है?

FYI करें,

$ ruby -v 
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] 

उत्तर

135

संपादित करें: के बाद से मैं इस सवाल का जवाब Base64.strict_encode64() जोड़ा गया है, जो नई-पंक्तियों नहीं जोड़ता है लिखा था।


The docs कुछ भ्रामक हैं, b64encode विधि हर 60 वें चरित्र के लिए एक नई पंक्ति जोड़ने के लिए माना जाता है, और encode64 विधि के लिए उदाहरण वास्तव में b64encode विधि का उपयोग कर रहा है।

ऐसा लगता है कि pack("m")encode64 द्वारा उपयोग की गई ऐरे क्लास के लिए विधि भी नईलाइन जोड़ती है। मैं इसे एक डिजाइन बग मानता हूं कि यह वैकल्पिक नहीं है।

आप या तो खुद को न्यूलाइन हटा सकते हैं, या यदि आप रेल का उपयोग कर रहे हैं, तो encode64s विधि के साथ ActiveSupport::CoreExtensions::Base64::Encoding है।

+37

ऐसा लगता है कि चूंकि मैंने यह उत्तर लिखा है, अब 'dire_encode64()' है जो स्पष्ट रूप से न्यूलाइन नहीं जोड़ता है। –

+12

तो गूंगा! तुम मेरे साथ ऐसा क्यों करते हो, रूबी? –

+1

यह मुझे मार रहा था! किसी भी अच्छे कारण के लिए बस एक घंटा बर्बाद कर दिया! –

9

हाँ, यह काफी सामान्य है। doc लाइन-स्प्लिटिंग का प्रदर्शन करने वाला एक उदाहरण देता है। बेस 64 अन्य भाषाओं में भी वही काम करता है (उदाहरण के लिए पायथन)।

एनकोड चरण में सामग्री मुक्त न्यूलाइन जोड़े जाने का कारण यह है कि बेस 64 मूल रूप से ई-मेल में बाइनरी सामग्री भेजने के लिए एन्कोडिंग तंत्र के रूप में तैयार की गई थी, जहां रेखा की लंबाई सीमित है। यदि आपको उनकी आवश्यकता नहीं है तो उन्हें दूर करने के लिए स्वतंत्र महसूस करें।

+1

यह अभी मेरे एंड्रॉइड ऐप (जावा की बेस 64 लाइब्रेरी) में हुआ था। मैं इस अजीब घटना के साथ पूरी तरह उलझन में था। क्या गलत है और फिर त्रुटि की खोज करने के लिए मुझे सचमुच 1 घंटा लगा। यह टिप्पणी 6 वर्षों के बाद भी विरासत के मुद्दों को समझने में मदद कर रही है। –

99

रूबी-1.9.2 में आपके पास बेस 64.strict_encode64 है जो अंत में \ n (newline) नहीं जोड़ता है।

+0

यह एक बहुत आसान समाधान है! – Avishai

+0

यह स्वीकार्य उत्तर – Darbio

+0

समाधान के लिए धन्यवाद होना चाहिए !!! – qcam

2

लगता है वे छीन लिया जा करने के लिए/पर ध्यान नहीं दिया, जैसे मिल गया है:

Base64.encode64(str).gsub(/\n/, '') 
+0

यह समाधान गंदा है .. कोई और? –

+1

@yaauie ([सुझाए गए संपादन के माध्यम से] (http://stackoverflow.com/review/suggested-edits/6210102)): संपादन जो पर्याप्त परिवर्तन करते हैं, आम तौर पर नहीं किया जाना चाहिए। मैं इसे एक अलग उत्तर के रूप में पोस्ट करने की अनुशंसा करता हूं। – Pokechu22

0

उपयोग strict_encode64 विधि। encode64 जोड़ता है \ n प्रत्येक 60 प्रतीकों