रूबी में बेस 64 एन्कोडेड स्ट्रिंग में स्ट्रेंज \ n


159

रूबी में इनबिल्ट बेस 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

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

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

FYI करें,

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

यहाँ एक ही अजीब समस्या है
नदव बी

जवाबों:


223

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


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

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

आप या तो स्वयं नईलाइन हटा सकते हैं, या यदि आप रेल का उपयोग कर रहे हैं, तो ActiveSupport :: CoreExtensions :: Base64 ::encode64s विधि के साथ एन्कोडिंग है


44
ऐसा लगता है कि जब से मैंने यह उत्तर लिखा है, अब strict_encode64()ऐसा नहीं है जो अस्थिरता से नई-नई कहानियों को जोड़ता नहीं है।
क्रिस्टोफर हम्मरस्ट्रॉम

15
एकदम गूंगा! तुम मेरे साथ ऐसा क्यों करते हो, रूबी?
जोश एम।

1
यह एक असेंबल डिफ़ॉल्ट है, लेकिन @ ChristofferHammarström उल्लेख के रूप में, अब एक असली b64 एन्कोडिंग प्राप्त करने का एक तरीका है।
दान

1
जाहिरा तौर पर यह सॉफ्टवेयर के साथ पीछे के कंप्टिटर्स को बनाए रखने के लिए मौजूद है जो लंबी लाइनों को संभाल नहीं सकते हैं। stackoverflow.com/a/20065991/5749914
युद्ध समान चिंपांज़ी

115

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


यह एक बहुत आसान उपाय है!
अविशाई

मैंने जाँच की है Base64.strict_encode64 ठीक से तीन वर्ण स्ट्रिंग एन्कोडेड नहीं है। Base64.strict_encode64 ('abc') की तरह -> YWJj। उपरोक्त उदाहरण सही ढंग से एन्कोड नहीं किया गया है।
कोडमेकर

9

हाँ, यह बिल्कुल सामान्य है। दस्तावेज़ एक उदाहरण लाइन बंटवारे का प्रदर्शन देता है। base64 अन्य भाषाओं में भी यही काम करता है (जैसे। Python)।

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


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

5

लगता है कि उन्हें छीन लिया गया / अनदेखा किया गया, जैसे:

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

यह घोल गंदा है .. कोई और?
अर्नोल्ड रोआ

1
@ आईएयूआई ( सुझाए गए संपादन के माध्यम से ): संपादन जो एक महत्वपूर्ण बदलाव करते हैं, उन्हें आम तौर पर नहीं किया जाना चाहिए। मैं एक अलग जवाब के रूप में पोस्ट करने की सलाह दूंगा।
1

3

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


क्या हम इसे 76 प्रतीकों के बाद जोड़ने के लिए बदल सकते हैं?
सोनिक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.