বেস 64 স্ট্রিংকে অ্যারেবফারে রূপান্তর করুন


105

আমার একটি বেস 64 এনকোড স্ট্রিংকে অ্যারেবফারে রূপান্তর করতে হবে। বেস 64 স্ট্রিংগুলি ব্যবহারকারী ইনপুট, সেগুলি অনুলিপি করে একটি ইমেল থেকে আটকানো হবে, যাতে পৃষ্ঠাটি লোড হওয়ার পরে তারা সেখানে থাকে না। আমি জাভাস্ক্রিপ্টে এটি করতে চাই যদি সম্ভব হয় তবে সার্ভারে একটি অজাক্স কল না করে।

আমি এই লিঙ্কগুলি আকর্ষণীয় পেয়েছি তবে তারা আমাকে সহায়তা করেনি:

বেস 64 টি এনকোডড স্ট্রিংয়ে অ্যারেবফার

এটি আরেবাফার থেকে বেস 64 এর বিপরীত রূপান্তর সম্পর্কে, অন্যভাবে নয় not

http://jsperf.com/json-vs-base64/2

এটি দেখতে দুর্দান্ত লাগছে তবে কোডটি কীভাবে ব্যবহার করব তা আমি বুঝতে পারি না।

রূপান্তরটি করার কি কোনও সহজ (সম্ভবত নেটিভ) উপায় আছে? ধন্যবাদ

উত্তর:


153

এটা চেষ্টা কর:

function _base64ToArrayBuffer(base64) {
    var binary_string = window.atob(base64);
    var len = binary_string.length;
    var bytes = new Uint8Array(len);
    for (var i = 0; i < len; i++) {
        bytes[i] = binary_string.charCodeAt(i);
    }
    return bytes.buffer;
}

4
এখানে সত্যিই কি ঘটছে তা আমাকে ব্যাখ্যা করুন।
গভী এস

4
ভাল এটি বেশ সোজা, প্রথমে আমরা বেস 64 স্ট্রিংটি (এটোব) ডিকোড করি, তারপরে আমরা ডিকোডড স্ট্রিংয়ের সমান দৈর্ঘ্য সহ 8-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার নতুন অ্যারে তৈরি করি। এরপরে আমরা স্ট্রিংটি পুনরাবৃত্তি করি এবং স্ট্রিংয়ের প্রতিটি অক্ষরের ইউনিকোড মান সহ অ্যারেটি তৈরি করি।
Goran.it

4
এমডিএন থেকে: বেস 64 একই ধরণের বাইনারি-থেকে-পাঠ্য এনকোডিং স্কিমগুলির একটি গোষ্ঠী যা ASCII স্ট্রিং ফর্ম্যাটে বাইনারি ডেটা উপস্থাপন করে এটি একটি রেডিক্স -৪৪ উপস্থাপনায় অনুবাদ করে। Uint8Array টাইপযুক্ত অ্যারে 8-বিট স্বাক্ষরযুক্ত ইন্টিজারগুলির একটি অ্যারের প্রতিনিধিত্ব করে, এবং আমরা ডেটা (যা একটি 8-বিট
টেবিলও

4
এটি সঠিক নয়। এটি জাভাস্ক্রিপ্টকে বাইটগুলি স্ট্রিং হিসাবে ব্যাখ্যা করতে দেয় যা ডেটাকে প্রভাবিত করে যা আসলে বাইনারি হয়।
টোমা জ্যাটো - মনিকা

4
সমস্যা হলো ক) প্রতিটি বাইট ক্রম বৈধ ইউনিকোড খ হয়) ইউনিকোড নেই যে চরিত্র এক বাইট তাই bytes[i] = binary_string.charCodeAt(i);ভুল হতে পারে
মিশ্রণ

54

TypedArray.from ব্যবহার করে :

Uint8Array.from(atob(base64_string), c => c.charCodeAt(0))

Goran.it উত্তরের লুপ সংস্করণের সাথে তুলনা করতে পারফরম্যান্স।


4
এই ধরণের ওয়ান লাইনারটি কার পছন্দ করে তা মনে রাখবেন যে Uint8Array.fromকয়েকটি ব্রাউজারের সাথে এখনও সামান্য সামঞ্জস্য রয়েছে।
IzumiSy

4
দয়া করে atob বা btoa এর সুপারিশ করবেন না: developer.mozilla.org/en-US/docs/Web/API/WindowBase64/…
কুগেল

রেল সংকলক এই স্ট্রিংটি পরিচালনা করতে পারে না এবং এতে ব্যর্থ হয় ExecJS::RuntimeError: SyntaxError: Unexpected token: operator (>); (রেলপথ 5)
অ্যাভেল ক্রস

4
এটি কোনও অ্যারে বাফার নয়। এটি টাইপ করা অ্যারে। .bufferযা থেকে ফিরে আসে তার সম্পত্তির মাধ্যমে আপনি অ্যারে বাফারে অ্যাক্সেস পানUint8Array
অলিগোফ্রেন

4
@ সাইটস, এর সাথে কোনও ভুল নেই atobবা btoa, আপনাকে কেবল তাদের বৈধ ইনপুট দিতে হবে। atobএকটি বৈধ বেস 64 স্ট্রিং দরকার, অন্যথায় এটি একটি ত্রুটি ছুঁড়ে দেবে। এবং btoaএকটি বৈধ বাইট স্ট্রিং (একটি বাইনারি স্ট্রিংও বলা হয়) দরকার যা 0-255 পরিসরের অক্ষরের সমন্বিত একটি স্ট্রিং। যদি আপনার স্ট্রিংয়ের সেই ব্যাপ্তির বাইরে অক্ষর থাকে তবে btoaত্রুটি ছুঁড়ে দেবে।
গেমফ্রি

34

জাভাস্ক্রিপ্টে ইউনিকোড সমস্যার কারণে Goran.it এর উত্তর কাজ করে না - https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding

আমি ড্যানিয়েল গেরেরোর ব্লগে প্রদত্ত ফাংশনটি ব্যবহার করে শেষ করেছি: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/

গিথুব লিঙ্কে ফাংশন তালিকাভুক্ত করা হয়েছে: https://github.com/danguer/blog-example/blob/master/js/base64-binary.js

এই লাইনগুলি ব্যবহার করুন

var uintArray = Base64Binary.decode(base64_string);  
var byteArray = Base64Binary.decodeArrayBuffer(base64_string); 

4
অ্যাটব ব্যবহারের চেয়ে এই পদ্ধতিটি 2x দ্রুত।
xiaoyu2er

4
আপনি একটি উদাহরণ দিতে পারেন যার জন্য এটি কাজ করবে না? নিবন্ধটি স্বেচ্ছাসেবী স্ট্রিংগুলি এনকোডিং সম্পর্কে কথা বলেছে, এতে ইউনিকোডের অক্ষর থাকতে পারে তবে এটি মোটেই প্রযোজ্য atobনয়।
রিভ

4
decodeArrayBufferএকটি ফেরৎ ArrayBufferআকার, সবসময় 3 দ্বারা বিভাজ্য হলে নকশা বা একটি বাগ দ্বারা যা আমি বুঝতে পারছি না রয়েছে। আমি গিথুব প্রকল্পে জিজ্ঞাসা করব।
ceztko

@ceztko সম্ভবত এটি (দুর্ঘটনাজনিত) নকশা দ্বারা। বেস 64 এনকোডিং অ্যালগরিদম 3 বাইটের গ্রুপ নেয় এবং এগুলিকে 4 টি অক্ষরে রূপান্তরিত করে। ডিকোড পদ্ধতিটি সম্ভবত এমন একটি অ্যারেবাফার বরাদ্দ করে যার দৈর্ঘ্য বেস 64 স্ট্রিং.লেথ / 4 * 3 বাইট এবং শেষ হওয়ার পরে কখনই কোনও অব্যবহৃত বাইট কাটা হয় না।
সর্বদা

4
@ অ্যালওয়েস লার্নিং এর অর্থ সম্ভবত বগু হ'ল যেহেতু বাম দিকের শূন্য বাইটগুলি লক্ষ্যযুক্ত আউটপুট সামগ্রীকে দূষিত করতে পারে।
ceztko

23

মাত্র 6464-অ্যারেবফারটি পাওয়া গেছে, গত মাসে (2017-08) অবিশ্বাস্যরূপে উচ্চ ব্যবহারের সাথে একটি ছোট এনপিএম প্যাকেজ, 5 এম ডাউনলোড।

https://www.npmjs.com/package/base64-arraybuffer

যে কেউ সেরা মানের সমাধানের জন্য কিছু খুঁজছেন, এটি এটি হতে পারে।


10

অ্যাসিঙ্ক সমাধান, ডেটা বড় হলে এটি আরও ভাল:

// base64 to buffer
function base64ToBufferAsync(base64) {
  var dataUrl = "data:application/octet-binary;base64," + base64;

  fetch(dataUrl)
    .then(res => res.arrayBuffer())
    .then(buffer => {
      console.log("base64 to buffer: " + new Uint8Array(buffer));
    })
}

// buffer to base64
function bufferToBase64Async( buffer ) {
    var blob = new Blob([buffer], {type:'application/octet-binary'});    
    console.log("buffer to blob:" + blob)

    var fileReader = new FileReader();
    fileReader.onload = function() {
      var dataUrl = fileReader.result;
      console.log("blob to dataUrl: " + dataUrl);

      var base64 = dataUrl.substr(dataUrl.indexOf(',')+1)      
      console.log("dataUrl to base64: " + base64);
    };
    fileReader.readAsDataURL(blob);
}

7

নোড.জেএস ব্যবহারকারীদের জন্য:

const myBuffer = Buffer.from(someBase64String, 'base64');

মাইবফারটি টাইপ বাফার হবে যা ইউিন্ট 8আরাইয়ের একটি সাবক্লাস। দুর্ভাগ্যক্রমে, Uint8Araray কোনও অ্যারেবফার নয় কারণ ওপি যেমনটি চেয়েছিল। তবে অ্যারেবফারটি পরিচালনা করার সময় আমি প্রায়শই এটি ইউিনট 8 আরে বা অনুরূপ কিছু দিয়ে মুড়িয়ে রাখি, তাই যা চাওয়া হচ্ছে তার কাছাকাছি হওয়া উচিত।


6

জাভাস্ক্রিপ্ট একটি সূক্ষ্ম বিকাশের পরিবেশ, সুতরাং এটি এই ছোট সমস্যাটির সমাধান সরবরাহ করে না বলে এটি বিজোড় বলে মনে হয়। এই পৃষ্ঠায় অন্য যে কোনও জায়গায় প্রদত্ত সমাধানগুলি সম্ভাব্য ধীর are এখানে আমার সমাধান। এটি ইনবিল্ট কার্যকারিতা নিয়োগ করে যা বেস 64৪ চিত্র এবং শব্দ ডেটা ইউআরএলগুলি ডিকোড করে।

var req = new XMLHttpRequest;
req.open('GET', "data:application/octet;base64," + base64Data);
req.responseType = 'arraybuffer';
req.onload = function fileLoaded(e)
{
   var byteArray = new Uint8Array(e.target.response);
   // var shortArray = new Int16Array(e.target.response);
   // var unsignedShortArray = new Int16Array(e.target.response);
   // etc.
}
req.send();

বেস 64 স্ট্রিংটি খারাপভাবে তৈরি হয়ে থাকলে প্রেরণের অনুরোধটি ব্যর্থ হয়।

মাইম টাইপ (অ্যাপ্লিকেশন / অক্টেট) সম্ভবত অপ্রয়োজনীয়।

ক্রোমে পরীক্ষিত। অন্যান্য ব্রাউজারে কাজ করা উচিত।


4
এটি ছিল আমার জন্য সহজ সমাধান, সহজ এবং পরিষ্কার। আমি দ্রুত এটি ফায়ারফক্স, আইই ১১, এজতে পরীক্ষা করে দেখেছি এবং দুর্দান্ত কাজ করেছি!
সিএস-নেট

আমি নিশ্চিত না যে এটি আইই ১১ এ আপনার জন্য কীভাবে কাজ করে তবে আমি একটি Access Deniedত্রুটি পেয়েছি যা মনে হয় এটি একটি করস সীমাবদ্ধতা।
সার্জিউ

2

খাঁটি জেএস - কোনও স্ট্রিং মিডলস্টেপ নেই (কোনও অ্যাটোব নেই)

আমি নিম্নলিখিত ফাংশনটি লিখি যা বেস 64 কে সরাসরি উপায়ে রূপান্তর করে (মিডলস্টেপে স্ট্রিংতে রূপান্তর ছাড়াই)। ধারণা

  • 4 বেস 64 অক্ষরের অংশ পান
  • বেস 64 বর্ণমালায় প্রতিটি অক্ষরের সূচি সন্ধান করুন
  • সূচিটি 6-বিট সংখ্যায় রূপান্তর করুন (বাইনারি স্ট্রিং)
  • চারটি 6 বিট সংখ্যায় যোগদান করুন যা 24-বিট সংখ্যা দেয় (বাইনারি স্ট্রিং হিসাবে সঞ্চিত)
  • 24-বিট স্ট্রিংকে তিনটি 8-বিটে বিভক্ত করুন এবং প্রতিটি সংখ্যায় প্রচ্ছন্ন করুন এবং আউটপুট অ্যারেগুলিতে সঞ্চয় করুন
  • কোণার কেস: যদি ইনপুট বেস 64 স্ট্রিংটি এক / দুটি =চর দিয়ে শেষ হয় তবে আউটপুট অ্যারে থেকে এক / দুটি সংখ্যা সরান

সমাধানের নীচে বড় ইনপুট বেস 64 স্ট্রিংগুলি প্রক্রিয়া করার অনুমতি দেয়। বাইটো না করে বাইটগুলি বেস 64 এ রূপান্তর করার জন্য অনুরূপ ফাংশনটি এখানে


সুতরাং কোন অনুপস্থিত "?"
গিলসফট এবি

একটি ব্রাউজারে পরীক্ষা করুন, আমি নিশ্চিত নই যে এটি প্রত্যাশিত ফলাফল? "ওয়ান্ডারল্যান্ডে অ্যালিসের অ্যাডভেঞ্চার" (যার শেষ চরিত্রটি
এনএএন

4
@ গিলসোফ্যাব এই তথ্যটির জন্য আপনাকে ধন্যবাদ জানায় - আপনি ঠিক বলেছেন - আমি সমস্যাটি ঠিক করেছি
কামিল কিয়েসজেউস্কি

-4
const str = "dGhpcyBpcyBiYXNlNjQgc3RyaW5n"
const encoded = new TextEncoder().encode(str) // is Uint8Array
const buf = encoded.buffer // is ArrayBuffer

6
নোট করুন যে এটি কোনও বেস 64 ডিকোডিং / এনকোডিং করে না। এটি কেবলমাত্র "বেস64" এর 6 বাইটকে 6-এলিমেন্ট অ্যারেবফার বা Uint8Array তে পরিণত করে।
দুবেক

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