রুবিতে বেস 64 এনকোডড স্ট্রিংয়ে range n অদ্ভুত


159

রুবির ইনবিল্ট বেস 64 লাইব্রেরি কিছু ''s 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 এর শেষ থেকে শেষ এবং 6th ষ্ঠ অবস্থানে রয়েছে। ডিকোডার (বেস 64.ডেকোড 64) পুরানো স্ট্রিংটি পুরোপুরি ফিরিয়ে দেয়। আশ্চর্যের বিষয় হ'ল এগুলি এনকোড স্ট্রিংয়ে কোনও মান যুক্ত করে না। আমি যখন আউটপুট স্ট্রিং থেকে নিউলাইনগুলি সরিয়ে ফেলি, ডিকোডারটি আবার পুরোপুরি ডিকোড করে।

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

এর বেশি, আমি একই ইনপুট স্ট্রিংয়ের বেস 64 এনকোডড আউটপুট উত্পাদন করতে অন্য একটি জেএস লাইব্রেরি ব্যবহার করেছি, আউটপুট \ n এর ছাড়াই আসে।

এটি কি বাগ বা অন্য কিছু? এর আগে কি কেউ এই সমস্যার মুখোমুখি হয়েছে?

অবগতির জন্য,

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

এখানে একই অদ্ভুত সমস্যা
নাদাভ বি

উত্তর:


223

সম্পাদনা: যেহেতু আমি এই উত্তরটি লিখেছি Base64.strict_encode64()তা যুক্ত করা হয়েছিল, যা নতুন লাইন যুক্ত করে না।


দস্তাবেজগুলি কিছুটা বিভ্রান্তিকর, b64encodeপদ্ধতিটি প্রতি 60 তম চরিত্রের জন্য একটি নতুন লাইন যুক্ত করার কথা, এবং encode64পদ্ধতির উদাহরণটি আসলে b64encodeপদ্ধতিটি ব্যবহার করে ।

দেখে মনে হচ্ছে pack("m")অ্যারে ক্লাসের জন্য ব্যবহৃত পদ্ধতিটি encode64নতুন লাইনগুলি যুক্ত করে। আমি এটিকে ডিজাইন বাগ হিসাবে বিবেচনা করব যা এটি optionচ্ছিক নয়।

হয় আপনি নিজেই নিউলাইনগুলি সরিয়ে ফেলতে পারেন, বা আপনি যদি রেল ব্যবহার করছেন তবে অ্যাক্টিভসপোর্ট :: কোর-এক্সটেনশনগুলি :: বেস 64:encode64s পদ্ধতির সাথে এনকোডিং রয়েছে ।


44
দেখে মনে হচ্ছে যেহেতু আমি এই উত্তরটি লিখেছি এখন সেখানে রয়েছে strict_encode64()যা সম্ভবত নতুন লাইনের যোগ করে না।
ক্রিস্টোফার হামারস্ট্রিম

15
তাই মূক! তুমি আমার সাথে কেন এমন করছ রুবি?
জোশ এম

1
এটি একটি অ্যাসিনিই ডিফল্ট, তবে @ ক্রিস্টোফারহ্যামারস্ট্রিম উল্লেখ করেছেন যে, এখন সত্যিকারের b64 এনকোডিংয়ের উপায় রয়েছে।
ড্যান

1
স্পষ্টতই এটি এমন সফ্টওয়্যারটির সাথে পিছনের তুলনাটি বজায় রাখার জন্য বিদ্যমান যা দীর্ঘ লাইনগুলি পরিচালনা করতে পারে না। stackoverflow.com/a/20065991/5749914
যুদ্ধের মতো শিম্পাঞ্জি

115

রুবি-১.৯.২ এ আপনার কাছে বেস 64৪.stict_encode64 রয়েছে যা শেষে that n (নতুন লাইন) যুক্ত করে না।


এটি অনেক সহজ সমাধান!
অবিশাই

আমি বেস 64 কে পরীক্ষা করেছি rict স্ট্রিট_েনকোড 64 টি তিনটি অক্ষরের স্ট্রিং সঠিকভাবে এনকোড করা হয়নি। বেস 64.strict_encode64 ('abc') -> YWJj এর মতো। উপরের উদাহরণটি সঠিকভাবে এনকোড করা হয়নি।
কোডমেকার

9

হ্যাঁ, এটি বেশ স্বাভাবিক। ডক একটি উদাহরণ লাইন বিভাজন প্রদর্শক দেয়। বেস 64 অন্যান্য ভাষায়ও একই কাজ করে (উদাঃ পাইথন)।

এনকোড পর্যায়ে বিষয়বস্তু মুক্ত নিউলাইনগুলি যুক্ত হওয়ার কারণ হ'ল বেস 64 মূলত ইমেলটিতে বাইনারি সামগ্রী প্রেরণের জন্য একটি এনকোডিং ব্যবস্থা হিসাবে তৈরি হয়েছিল, যেখানে লাইনের দৈর্ঘ্য সীমাবদ্ধ। আপনার যদি তাদের প্রয়োজন না হয় তবে এগুলিকে সরিয়ে দিতে নির্দ্বিধায় মনে করুন।


1
এটি সবেমাত্র আমার অ্যান্ড্রয়েড অ্যাপে (জাভার বেস 64 লাইব্রেরি) ঘটেছে। আমি এই অদ্ভুত ঘটনাটি সম্পর্কে সম্পূর্ণ বিভ্রান্ত হয়ে পড়েছিলাম। কী ঘটেছে তা বের করার জন্য আমাকে আক্ষরিক 1 ঘন্টা সময় নিয়েছে এবং তারপরে ত্রুটিটি অনুসন্ধান করেছে। এই মন্তব্যটি 6 বছর পরেও উত্তরাধিকার সম্পর্কিত সমস্যাগুলি বুঝতে সহায়তা করে।
বার্লারহোব্বিট

5

দেখে মনে হচ্ছে এগুলি ছিনিয়ে নেওয়া / উপেক্ষা করা হবে:

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

এই সমাধান নোংরা .. অন্যথায়?
আর্নল্ড রোয়া

1
@ আইউই ( প্রস্তাবিত সম্পাদনার মাধ্যমে ): সম্পাদনাগুলি যে উল্লেখযোগ্য পরিবর্তন করে তা সাধারণত করা উচিত নয়। আমি আলাদা পোস্ট হিসাবে পোস্ট করার পরামর্শ দিই।
পোকেচু 22

3

strict_encode64পদ্ধতি ব্যবহার করুন । encode6460 n প্রতি 60 টি প্রতীক যুক্ত করে


আমরা কি এটি 76 টি চিহ্নের পরে যুক্ত করতে পরিবর্তন করতে পারি?
পুত্র

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.