স্ট্রিং এবং অ্যারেবফারগুলির মধ্যে রূপান্তর করা


264

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


1
আমার এতে কোনও অভিজ্ঞতা নেই তবে আপনি যদি এটি নির্মাণ করেন তবে এপিআই ডকুমেন্টেশন ( khronos.org/registry/typedarray/specs/latest ) থেকে বিচার করা যদি Int8Array ArrayBufferViewঅক্ষর অনুলিপি করার জন্য কেবল বন্ধনী চিহ্নিতকরণ ব্যবহার করা সম্ভব হয় string[i] = buffer[i]এবং বিপরীতে।
এফ কে 82

2
@ এফ কে that২, এটি দেখতে একটি যুক্তিসঙ্গত পদ্ধতির মতো (জেএসের Uint16Array১--বিট অক্ষরের জন্য ব্যবহার করে ), তবে জাভাস্ক্রিপ্টের স্ট্রিংগুলি অপরিবর্তনীয় তাই আপনি সরাসরি কোনও চরিত্রের অবস্থান নির্ধারণ করতে পারবেন না। আমার তখনও String.fromCharCode(x)প্রতিটি মানটির Uint16Arrayএকটি অনুলিপি করে অনুলিপি করতে হবে Arrayএবং তারপরে কল .join()করতে হবে Array
কেপোজিন

@ কেপোজিন: সত্য, সত্যই তা মনে হয় নি।
এফ কে 82

5
@ কেপোজিন এটি দেখা গেছে যে বেশিরভাগ আধুনিক জেএস ইঞ্জিনগুলি স্ট্রিং কনটেনটেশনকে এমন বিন্দুতে অনুকূলিত করেছে যেখানে এটি কেবলমাত্র সস্তা ব্যবহারের জন্য সস্তা string += String.fromCharCode(buffer[i]);। এটি অদ্ভুত বলে মনে হচ্ছে যে স্ট্রিং এবং টাইপ করা অ্যারের মধ্যে রূপান্তর করার জন্য অন্তর্নির্মিত পদ্ধতি থাকবে না। তাদের এমন কিছু জানা উচিত ছিল যা সামনে আসবে।
ডাউনলোড করুন

arrayBuffer.toString () আমার পক্ষে ভাল কাজ করছে।
নাগরিক

উত্তর:


129

২০১ 2016 আপডেট করুন - পাঁচ বছর পর এখন সঠিক এনকোডিং ব্যবহার করে স্ট্রিং এবং টাইপ করা অ্যারেগুলির মধ্যে রূপান্তর করতে স্পেসে নতুন পদ্ধতি রয়েছে (নীচে সমর্থন দেখুন) are

TextEncoder

TextEncoderপ্রতিনিধিত্ব করে :

TextEncoderইন্টারফেস একটি নির্দিষ্ট পদ্ধতির জন্য একটি এনকোডার, একটি নির্দিষ্ট অক্ষর এনকোডিং যে, মত প্রতিনিধিত্ব করে utf-8,iso-8859-2, koi8, cp1261, gbk, ... একটি এনকোডার কোড পয়েন্টগুলির স্ট্রিমটিকে ইনপুট হিসাবে গ্রহণ করে এবং বাইটের একটি স্ট্রিম নির্গত করে।

উপরের লেখার পর থেকে নোট পরিবর্তন করুন: (আইবিড।)

দ্রষ্টব্য: ফায়ারফক্স, ক্রোম এবং অপেরা-এ utf-8 ব্যতীত অন্যান্য এনকোডিংয়ের জন্য সমর্থন ছিল (যেমন utf-16, iso-8859-2, koi8, cp1261, এবং gbk)। ফায়ারফক্স ৪৮ [...], ক্রোম [৪ [...] এবং অপেরা ৪১ অনুসারে, স্পেকের সাথে মেলে ধরতে utf-8 ব্যতীত অন্য কোনও এনকোডিং প্রকার উপলব্ধ নয় *

*) আপডেট করা চশমা (ডাব্লু 3) এবং এখানে (হোয়াটজিও)।

এর উদাহরণ তৈরির পরে TextEncoderএটি একটি স্ট্রিং নেবে এবং প্রদত্ত এনকোডিং প্যারামিটার ব্যবহার করে এটি এনকোড করবে:

if (!("TextEncoder" in window)) 
  alert("Sorry, this browser does not support TextEncoder...");

var enc = new TextEncoder(); // always utf-8
console.log(enc.encode("This is a string converted to a Uint8Array"));

আপনি অবশ্যই অবশ্যই প্রয়োজনের .bufferভিত্তিতে Uint8Arrayআন্ডারলাইংকে ArrayBufferএকটি ভিন্ন দৃশ্যে রূপান্তর করতে ফলাফলের প্যারামিটারটি ব্যবহার করেন ।

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

সাধারণ ব্যবহারের জন্য আপনি ইউটিএফ -16 এনকোডিংটি পছন্দ মতো জিনিসের জন্য ব্যবহার করবেন localStorage

TextDecoder

তেমনি, বিপরীত প্রক্রিয়াটি ব্যবহার করেTextDecoder :

TextDecoderইন্টারফেস একটি নির্দিষ্ট পদ্ধতি, যে একটি নির্দিষ্ট অক্ষর এনকোডিং, মত একটি ডিকোডার প্রতিনিধিত্ব করে utf-8, iso-8859-2, koi8, cp1261, gbk, ... একটি ডিকোডার বাইটের একটি প্রবাহ ইনপুট হিসাবে নেয় এবং কোড পয়েন্ট একটি স্ট্রিম নির্গত।

সমস্ত উপলব্ধ ডিকোডিংয়ের ধরণগুলি এখানে পাওয়া যাবে

if (!("TextDecoder" in window))
  alert("Sorry, this browser does not support TextDecoder...");

var enc = new TextDecoder("utf-8");
var arr = new Uint8Array([84,104,105,115,32,105,115,32,97,32,85,105,110,116,
                          56,65,114,114,97,121,32,99,111,110,118,101,114,116,
                          101,100,32,116,111,32,97,32,115,116,114,105,110,103]);
console.log(enc.decode(arr));

MDN স্ট্রিংভিউ লাইব্রেরি

এর বিকল্প হ'ল StringViewলাইব্রেরিটি ব্যবহার করা (lgpl-3.0 হিসাবে লাইসেন্স দেওয়া) কোনটি লক্ষ্য:

  • জাভাস্ক্রিপ্ট অ্যারেবফার ইন্টারফেসের উপর ভিত্তি করে স্ট্রিংগুলির জন্য সি-জাতীয় ইন্টারফেস তৈরি করতে (যেমন, অক্ষর কোডগুলির একটি অ্যারে - জাভাস্ক্রিপ্টে একটি অ্যারেবফারভিউ)
  • স্ট্রিংভিউ.প্রোটোটাইপ অবজেক্টটিতে পদ্ধতি যুক্ত করে যে কেউ প্রসারিত করতে পারে এমন একটি অত্যন্ত এক্সটেনসিবল লাইব্রেরি তৈরি করতে
  • এই জাতীয় স্ট্রিং-জাতীয় অবজেক্টের (এখন থেকে: স্ট্রিংভিউগুলি) নতুন অবিচ্ছেদ্য জাভাস্ক্রিপ্ট স্ট্রিং তৈরি করার পরিবর্তে সংখ্যার অ্যারেতে কঠোরভাবে কাজ করে এমনগুলির জন্য পদ্ধতির সংগ্রহ তৈরি করতে
  • জাভাস্ক্রিপ্টের ডিফল্ট UTF-16 DOMStrings ব্যতীত অন্য ইউনিকোড এনকোডিংগুলির সাথে কাজ করতে

আরো অনেক নমনীয়তা প্রদান। তবে, আধুনিক ব্রাউজারগুলিতে TextEncoder/ TextDecoderঅন্তর্নির্মিত হওয়ার সময় আমাদের এই লাইব্রেরির সাথে লিঙ্ক বা এম্বেড করা প্রয়োজন ।

সমর্থন

জুলাই / 2018 পর্যন্ত:

TextEncoder (পরীক্ষামূলক, অন স্ট্যান্ডার্ড ট্র্যাক)

 Chrome    | Edge      | Firefox   | IE        | Opera     | Safari
 ----------|-----------|-----------|-----------|-----------|-----------
     38    |     ?     |    19°    |     -     |     25    |     -

 Chrome/A  | Edge/mob  | Firefox/A | Opera/A   |Safari/iOS | Webview/A
 ----------|-----------|-----------|-----------|-----------|-----------
     38    |     ?     |    19°    |     ?     |     -     |     38

°) 18: Firefox 18 implemented an earlier and slightly different version
of the specification.

WEB WORKER SUPPORT:

Experimental, On Standard Track

 Chrome    | Edge      | Firefox   | IE        | Opera     | Safari
 ----------|-----------|-----------|-----------|-----------|-----------
     38    |     ?     |     20    |     -     |     25    |     -

 Chrome/A  | Edge/mob  | Firefox/A | Opera/A   |Safari/iOS | Webview/A
 ----------|-----------|-----------|-----------|-----------|-----------
     38    |     ?     |     20    |     ?     |     -     |     38

Data from MDN - `npm i -g mdncomp` by epistemex

2
আইই এবং এজ থেকে টেক্সটডেকোডারটির জন্য কোনও সমর্থন নেই: ক্যানিউজ.com
আন্দ্রে ডামিয়ান-ফেকেট

1
এমএসের মতে এটি বিকাশে রয়েছে: ডেভেলপার.মাফিক
মরিস মুলার

2018-04-18 এ সাফারি মোবাইলের জন্য কোনও সমর্থন নেই (আইওএস): বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ব্রোঞ্জের মানুষ

ওয়ান-লাইনার: var encoder = 'TextEncoder' in window ? new TextEncoder() : {encode: function(str){return Uint8Array.from(str, function(c){return c.codePointAt(0);});}};যাতে আপনি কেবল পারেনvar array = encoder.encode('hello');
ইয়েতি

1
জিনিসটি TextEncoderহ'ল যদি আপনার কাছে স্ট্রিনে বাইনারি ডেটা থাকে (যেমন, চিত্র), আপনি ব্যবহার করতে চান না TextEncoder(দৃশ্যত)। 127 এর বেশি কোড পয়েন্ট সহ অক্ষর দুটি বাইট তৈরি করে। আমার কাছে স্ট্রিনে বাইনারি ডেটা থাকবে কেন? cy.fixture(NAME, 'binary')( cypress) একটি স্ট্রিং উত্পাদন করে।
এক্স-ইউরি

175

যদিও ডেনিস এবং ব্ল্যাং / ফাইলরেডার কাজটি ব্যবহারের সমাধান জেনকেভ, তবে আমি এই পদ্ধতির গ্রহণের পরামর্শ দেব না। এটি একটি সাধারণ সমস্যার জন্য একটি অ্যাসিঙ্ক পদ্ধতি এবং এটি সরাসরি সমাধানের চেয়ে ধীর। আমি একটি সহজ এবং (আরও দ্রুত) সমাধান সহ এইচটিএমএল 5 প্রোতে একটি পোস্ট করেছি: http://updates.html5rocks.com/2012/06/How-to-convert-ArrayBuffer-to-and-from-String

এবং সমাধানটি হ'ল:

function ab2str(buf) {
  return String.fromCharCode.apply(null, new Uint16Array(buf));
}

function str2ab(str) {
  var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
  var bufView = new Uint16Array(buf);
  for (var i=0, strLen=str.length; i<strLen; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}

সম্পাদনা করুন:

এনকোডিং এপিআই স্ট্রিং রূপান্তর সমাধানে সাহায্য করে সমস্যা। উপরের মূল নিবন্ধে এইচটিএমএল 5 রকস.কমজেফ পোজনিকের প্রতিক্রিয়াটি দেখুন ।

উদ্ধৃতাংশ:

আপনার যে অনেক স্ট্যান্ডার্ড এনকোডিংয়ের সাথে কাজ করা উচিত তা বিবেচনা না করেই এনকোডিং এপিআই কাঁচা বাইট এবং স্থানীয় জাভাস্ক্রিপ্ট স্ট্রিংয়ের মধ্যে অনুবাদ করা সহজ করে তোলে।

<pre id="results"></pre>

<script>
  if ('TextDecoder' in window) {
    // The local files to be fetched, mapped to the encoding that they're using.
    var filesToEncoding = {
      'utf8.bin': 'utf-8',
      'utf16le.bin': 'utf-16le',
      'macintosh.bin': 'macintosh'
    };

    Object.keys(filesToEncoding).forEach(function(file) {
      fetchAndDecode(file, filesToEncoding[file]);
    });
  } else {
    document.querySelector('#results').textContent = 'Your browser does not support the Encoding API.'
  }

  // Use XHR to fetch `file` and interpret its contents as being encoded with `encoding`.
  function fetchAndDecode(file, encoding) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', file);
    // Using 'arraybuffer' as the responseType ensures that the raw data is returned,
    // rather than letting XMLHttpRequest decode the data first.
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
      if (this.status == 200) {
        // The decode() method takes a DataView as a parameter, which is a wrapper on top of the ArrayBuffer.
        var dataView = new DataView(this.response);
        // The TextDecoder interface is documented at http://encoding.spec.whatwg.org/#interface-textdecoder
        var decoder = new TextDecoder(encoding);
        var decodedString = decoder.decode(dataView);
        // Add the decoded file's text to the <pre> element on the page.
        document.querySelector('#results').textContent += decodedString + '\n';
      } else {
        console.error('Error while requesting', file, this);
      }
    };
    xhr.send();
  }
</script>

16
দুর্ভাগ্যক্রমে html5rocks এ আমার মন্তব্য অনুমোদিত হয়নি yet সুতরাং এখানে একটি সংক্ষিপ্ত উত্তর। আমি এখনও মনে করি, এটি সঠিক উপায় নয়, কারণ আপনি প্রচুর অক্ষর মিস করেন, বিশেষত কারণ বেশিরভাগ পৃষ্ঠাগুলি আজ ইউটিএফ -8 এনকোডিংয়ে রয়েছে। একদিকে, আরও বিশেষ অক্ষরের জন্য (আসুন এশিয়ান বলা যাক), চারকোডএট ফাংশনটি 4-বাইট মান দেয়, তাই সেগুলি কাটা হবে। অন্যদিকে, সরল ইংরেজী অক্ষরগুলি অ্যারেবফারটি দু'বার বাড়বে (আপনি প্রতি 1-বাইট চরিত্রের জন্য 2 বাইট ব্যবহার করছেন)। ওয়েবসকেটের মাধ্যমে একটি ইংরেজী পাঠ্য পাঠানোর কল্পনা করুন, এটির জন্য দ্বিগুণ সময় প্রয়োজন (রিয়েল টাইম পরিবেশে ভাল নয়)।
ডেনিস

9
তিনটি উদাহরণ: (১) This is a cool text!ইউটিএফ 8 এ 20 বাইট - ইউনিকোডে 40 বাইট। (2) ÄÖÜইউটিএফ 8-তে 6 বাইট - ইউনিকোডে 6 বাইট। (3) ☐☑☒ইউটিএফ 8-তে 9 বাইট - ইউনিকোডে 6 বাইট আপনি যদি স্ট্রিংটি ইউটিএফ 8-ফাইল হিসাবে (ব্লব এবং ফাইল লেখক এপিআই এর মাধ্যমে) সঞ্চয় করতে চান তবে আপনি এই 2 টি পদ্ধতি ব্যবহার করতে পারবেন না, কারণ অ্যারেবফার ইউনিকোডে থাকবে এবং ইউটিএফ 8-তে থাকবে না।
ডেনিস

3
আমি একটি ত্রুটি পেয়েছি: আনকচড রেঞ্জেরর: সর্বোচ্চ কল স্ট্যাকের আকার ছাড়িয়ে গেছে। কি সমস্যা হতে পারে?
জ্যাকব

6
@Dennis - জাতীয় স্ট্রিং UCS2 না UTF8 হওয়া (এমনকি UTF16) ব্যবহার করেন - মানে charCodeAt () সবসময় মান ফেরৎ 0 -> 65535. কোন UTF8 হওয়া কোড পয়েন্ট যে 4 বাইট প্রান্ত ভাড়াটে জোড়া সঙ্গে প্রতিনিধিত্ব করা হবে না প্রয়োজন (দেখুন en.wikipedia .org / wiki /… ) - অর্থাত্ পৃথক দুটি 16-বিট ইউসিএস 2 মান।
ব্রুফা

6
@ জ্যাকব - আমি বিশ্বাস করি ত্রুটিটি কারণ অ্যারেটির দৈর্ঘ্যের একটি সীমা রয়েছে যা প্রয়োগ () পদ্ধতিতে পাস হতে পারে। যেমনString.fromCharCode.apply(null, new Uint16Array(new ArrayBuffer(246300))).length Chrome এ আমার জন্য কাজ করে তবে আপনি যদি তার পরিবর্তে 246301 ব্যবহার করেন তবে আমি আপনার রেঞ্জের ব্যতিক্রমটি পেয়ে যাব
ব্রুফা

71

তুমি ব্যবহার করতে পার TextEncoder অ্যারেবফারগুলিতে এবং স্ট্রিংকে স্ট্রিংতে রূপান্তর করতে স্ট্রিংজকোডিং লাইব্রেরি দ্বারা পলিফিল্ড এনকোডিং স্ট্যান্ডার্ডটিTextDecoder থেকে এবং :

var uint8array = new TextEncoder().encode(string);
var string = new TextDecoder(encoding).decode(uint8array);

2
যাইহোক, এটি ফায়ারফক্সে ডিফল্টরূপে উপলব্ধ: developer.mozilla.org/en-US/docs/Web/API/TextDecoder.decode
জোয়েল রিচার্ড

2
নতুন এপিআই-র জন্য থাম্বস আপ যা অদ্ভুত কাজের চেয়ে আরও ভাল!
টোমা জ্যাটো - মনিকা

1
এটি সেখানে সমস্ত ধরণের অক্ষরের সাথে কাজ করবে না।
ডেভিড

5
npm install text-encoding, var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;। না ধন্যবাদ.
ইভান হু

গ্র্যাম্বল ... আমার যদি বিদ্যমান অ্যারেবুফার থাকে তবে আমি স্ট্রিং লিখতে চাই অনুমান করি আমাকে ইউন্ট ৮৮৮৮৮৮৮৮৮৮ take take take নিতে হবে এবং এটি দ্বিতীয়বার কপি করতে হবে ??
শানচ

40

ব্লব তুলনায় অনেক ধীর String.fromCharCode(null,array);

অ্যারে বাফার খুব বড় হয়ে যায় তবে তা ব্যর্থ হয়। আমি যে সর্বোত্তম সমাধানটি খুঁজে পেয়েছি তা হ'ল String.fromCharCode(null,array);এটিকে অপারেশনে ব্যবহার এবং বিভক্ত করা যা স্ট্যাকটি ফুঁকবে না, তবে একবারে একক চরের চেয়ে দ্রুত are

বড় অ্যারে বাফার জন্য সেরা সমাধানটি হ'ল:

function arrayBufferToString(buffer){

    var bufView = new Uint16Array(buffer);
    var length = bufView.length;
    var result = '';
    var addition = Math.pow(2,16)-1;

    for(var i = 0;i<length;i+=addition){

        if(i + addition > length){
            addition = length - i;
        }
        result += String.fromCharCode.apply(null, bufView.subarray(i,i+addition));
    }

    return result;

}

আমি এটি ব্লব ব্যবহারের চেয়ে প্রায় 20 গুণ বেশি গতিতে পেয়েছি। এটি 100 এমবিএমের বেশি স্ট্রিংয়ের জন্যও কাজ করে।


3
আমাদের এই সমাধানটি নিয়ে যাওয়া উচিত। এটি যেমন গ্রহণযোগ্যটির চেয়ে আরও একটি ব্যবহারের কেস সমাধান করে
স্যাম

24

জ্যাংকেভের উত্তরের ভিত্তিতে, আমি উভয় উপায়ে ফাংশন তৈরি করেছি, কারণ ব্লববিল্ডার স্ট্রিং এবং অ্যারেবফার পরিচালনা করতে পারে:

function string2ArrayBuffer(string, callback) {
    var bb = new BlobBuilder();
    bb.append(string);
    var f = new FileReader();
    f.onload = function(e) {
        callback(e.target.result);
    }
    f.readAsArrayBuffer(bb.getBlob());
}

এবং

function arrayBuffer2String(buf, callback) {
    var bb = new BlobBuilder();
    bb.append(buf);
    var f = new FileReader();
    f.onload = function(e) {
        callback(e.target.result)
    }
    f.readAsText(bb.getBlob());
}

একটি সহজ পরীক্ষা:

string2ArrayBuffer("abc",
    function (buf) {
        var uInt8 = new Uint8Array(buf);
        console.log(uInt8); // Returns `Uint8Array { 0=97, 1=98, 2=99}`

        arrayBuffer2String(buf, 
            function (string) {
                console.log(string); // returns "abc"
            }
        )
    }
)

অ্যারেবফার 2 স্ট্রিং () এ, আপনি কি কনসোল.লগ () এর পরিবর্তে কলব্যাক (...) কল করতে চেয়েছিলেন? অন্যথায় কলব্যাক যুক্তি অব্যবহৃত হয়।
ড্যান ফিলিমোর

এটি যাবার মতো দেখাচ্ছে - ধন্যবাদ জেনকেভ এবং ডেনিস। একদম নির্বোধ বলে মনে হচ্ছে যে এটি সম্পাদন করার মতো কোনও সুসংগত উপায় নেই তবে আপনি কী করতে পারেন ...
কেপোজিন

জাভাস্ক্রিপ্ট একক থ্রেডযুক্ত। সুতরাং ফাইলআরডার দুটি কারণে অ্যাসিনক্রোনাস: (1) এটি একটি বিশাল ফাইল ফাইল লোড করার সময় অন্যান্য জাভাস্ক্রিপ্টের প্রয়োগ নিষিদ্ধ করবে না (আরও জটিল অ্যাপ্লিকেশনটি কল্পনা করুন) এবং (2) এটি ইউআই / ব্রাউজারকে ব্লক করবে না (সাধারণ সমস্যা) দীর্ঘ কার্যকর জেএস কোড সহ)। প্রচুর এপিআই হ'ল অ্যাসিনক্রোনাস। এমনকি XMLHttpRequest 2 এ সিঙ্ক্রোনাস সরানো হয়েছে।
ডেনিস 16

আমি সত্যিই আশা করছিলাম এটি আমার পক্ষে কাজ করবে তবে স্ট্রিং থেকে অ্যারেবফারে রূপান্তরটি নির্ভরযোগ্যভাবে কাজ করছে না। আমি 256 টি মান সহ একটি অ্যারেবাফার তৈরি করছি এবং এটি 256 দৈর্ঘ্যের সাথে স্ট্রিংয়ে পরিণত করতে পারি But তবে তারপরে যদি আমি আমার প্রাথমিক অ্যারেবফারের বিষয়বস্তুর উপর নির্ভর করে - এটি আবার একটি অ্যারে বাফারে রূপান্তরিত করার চেষ্টা করি - আমি 376 উপাদান বের করছি। আপনি যদি আমার সমস্যার পুনঃপ্রজনন করার চেষ্টা করতে চান তবে আমি আমার অ্যারেবফারকে একটি ইউিনট 8আর্রে 16x16 গ্রিড হিসাবে চিকিত্সা করছি, অনেকগুলি মাইম টাইপের সাহায্যে a[y * w + x] = (x + y) / 2 * 16; চেষ্টা করেছি বলে গণনা করা getBlob("x")- কোনও ভাগ্য নেই।
ম্যাট ক্রিকশঙ্ক

18
নতুন ব্রাউজারগুলিতে ব্লববিল্ডার অবনতিযুক্ত। এ পরিবর্তন new BlobBuilder(); bb.append(buf);করুন new Blob([buf]), দ্বিতীয় ফাংশনে অ্যারেবফারকে ইউন্টআর্রে new UintArray(buf)(বা অন্তর্নিহিত ডেটা টাইপের জন্য যা উপযুক্ত তা) এর মাধ্যমে কাস্ট করুন এবং তারপরে getBlob()কলগুলি থেকে মুক্তি পান । পরিশেষে, পরিষ্কার-পরিচ্ছন্নতার জন্য, বিবিটির নাম পরিবর্তন করে ব্লব করুন কারণ এটি আর কোনও ব্লববিল্ডার নয়।
সোয়াবগ

18

নিম্নলিখিত সমস্ত অ্যারে বাফারগুলি থেকে বাইনারি স্ট্রিংগুলি সম্পর্কে

আমি ব্যবহার না করার পরামর্শ দিই

var binaryString = String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));

কারন এটা

  1. বড় বাফারগুলিতে ক্র্যাশ হয়েছে (কেউ "ম্যাজিক" আকার সম্পর্কে 246300 লিখেছেন তবে আমি Maximum call stack size exceeded120000 বাইট বাফারে ত্রুটি পেয়েছি (ক্রোম 29))
  2. এটির সত্যই খারাপ অভিনয় রয়েছে (নীচে দেখুন)

আপনার যদি সঠিকভাবে সিঙ্ক্রোনাস সলিউশন প্রয়োজন হয় তবে এর মতো কিছু ব্যবহার করুন

var
  binaryString = '',
  bytes = new Uint8Array(arrayBuffer),
  length = bytes.length;
for (var i = 0; i < length; i++) {
  binaryString += String.fromCharCode(bytes[i]);
}

এটি আগেরটির মতো ধীর তবে সঠিকভাবে কাজ করে। দেখে মনে হচ্ছে এটি লেখার মুহুর্তে সেই সমস্যার জন্য যথেষ্ট দ্রুত সমকালীন সমাধান নেই (এই বিষয়ে বর্ণিত সমস্ত গ্রন্থাগারগুলি তাদের সিঙ্ক্রোনাস বৈশিষ্ট্যের জন্য একই পদ্ধতির ব্যবহার করে)।

তবে আমি যা প্রস্তাব করছি তা হল Blob+ FileReaderঅ্যাপ্রোচ ব্যবহার করা

function readBinaryStringFromArrayBuffer (arrayBuffer, onSuccess, onFail) {
  var reader = new FileReader();
  reader.onload = function (event) {
    onSuccess(event.target.result);
  };
  reader.onerror = function (event) {
    onFail(event.target.error);
  };
  reader.readAsBinaryString(new Blob([ arrayBuffer ],
    { type: 'application/octet-stream' }));
}

একমাত্র অসুবিধা (সবার জন্য নয়) এটি হ'ল অ্যাসিনক্রোনাস । এবং এটি পূর্ববর্তী সমাধানগুলি প্রায় 8-10 গুণ বেশি দ্রুত ! (কিছু বিশদ: আমার পরিবেশের সাথে সিঙ্ক্রোনাস সলিউশনটি ২.৪ এমবি বাফারের জন্য ৯৫০-১০৫০ এমএস লেগেছিল তবে ফাইলরিডারের সাথে একই পরিমাণে একই পরিমাণে প্রায় ১০০-১২০ এমএসের সমাধান পাওয়া যায়। এবং আমি উভয়ই পরীক্ষা করে দেখেছি 100 কেবি বাফারে সিঙ্ক্রোনাস সলিউশন এবং তারা গ্রহণ করেছে) প্রায় একই সময়ে, সুতরাং লুপ 'প্রয়োগ' ব্যবহার করে খুব ধীর হয় না))

বিটিডাব্লু এখানে: স্ট্রিং লেখক থেকে অ্যারেবফারকে কীভাবে রূপান্তর করবেন এবং আমার মতো দুটি পদ্ধতির তুলনা করে সম্পূর্ণ বিপরীত ফলাফল পাবেন ( তার পরীক্ষার কোডটি এখানে ) কেন এত আলাদা ফলাফল? সম্ভবত তার পরীক্ষার স্ট্রিংটির কারণে যা 1Kb দীর্ঘ (তিনি এটিকে "veryLongStr" বলেছিলেন)। আমার বাফারটি আকারের ২.৪ এমবি আকারের একটি সত্যই বড় জেপিইজি চিত্র ছিল।


13

( আপডেট দয়া করে এই উত্তরটির ২ য় অর্ধেক দেখুন, যেখানে আমি (আশাবাদী) আরও একটি সম্পূর্ণ সমাধান সরবরাহ করেছি))

আমি এই ইস্যুতেও ছড়িয়ে পড়েছি, নিম্নলিখিতটি এফএফ 6 এ আমার জন্য কাজ করে (এক দিকের জন্য):

var buf = new ArrayBuffer( 10 );
var view = new Uint8Array( buf );
view[ 3 ] = 4;
alert(Array.prototype.slice.call(view).join(""));

দুর্ভাগ্যক্রমে, অবশ্যই, আপনি অক্ষরের পরিবর্তে অ্যারের মানগুলির ASCII পাঠ্য উপস্থাপনাটি শেষ করেছেন। এটি লুপের চেয়ে এখনও আরও কার্যকর (হওয়া উচিত)। যেমন। উপরের উদাহরণস্বরূপ, ফলাফলটি 0004000000বেশ কয়েকটি নাল চর এবং একটি ক্রিয়াকলাপের পরিবর্তে (4)।

সম্পাদনা:

এখানে এমডিসি দেখার পরে , আপনি নিম্নলিখিতটি থেকে একটি তৈরি করতে পারেন :ArrayBufferArray

var arr = new Array(23);
// New Uint8Array() converts the Array elements
//  to Uint8s & creates a new ArrayBuffer
//  to store them in & a corresponding view.
//  To get at the generated ArrayBuffer,
//  you can then access it as below, with the .buffer property
var buf = new Uint8Array( arr ).buffer;

আপনার মূল প্রশ্নের উত্তর দিতে, এটি আপনাকে ArrayBuffer<-> Stringকে নীচে রূপান্তর করতে দেয় :

var buf, view, str;
buf = new ArrayBuffer( 256 );
view = new Uint8Array( buf );

view[ 0 ] = 7; // Some dummy values
view[ 2 ] = 4;

// ...

// 1. Buffer -> String (as byte array "list")
str = bufferToString(buf);
alert(str); // Alerts "7,0,4,..."

// 1. String (as byte array) -> Buffer    
buf = stringToBuffer(str);
alert(new Uint8Array( buf )[ 2 ]); // Alerts "4"

// Converts any ArrayBuffer to a string
//  (a comma-separated list of ASCII ordinals,
//  NOT a string of characters from the ordinals
//  in the buffer elements)
function bufferToString( buf ) {
    var view = new Uint8Array( buf );
    return Array.prototype.join.call(view, ",");
}
// Converts a comma-separated ASCII ordinal string list
//  back to an ArrayBuffer (see note for bufferToString())
function stringToBuffer( str ) {
    var arr = str.split(",")
      , view = new Uint8Array( arr );
    return view.buffer;
}

সুবিধার জন্য, এখানে functionএকটি কাঁচা ইউনিকোডকে রূপান্তর Stringকরার জন্য একটি ArrayBuffer(কেবলমাত্র ASCII / এক-বাইট অক্ষরের সাথে কাজ করবে)

function rawStringToBuffer( str ) {
    var idx, len = str.length, arr = new Array( len );
    for ( idx = 0 ; idx < len ; ++idx ) {
        arr[ idx ] = str.charCodeAt(idx) & 0xFF;
    }
    // You may create an ArrayBuffer from a standard array (of values) as follows:
    return new Uint8Array( arr ).buffer;
}

// Alerts "97"
alert(new Uint8Array( rawStringToBuffer("abc") )[ 0 ]);

উপরেরটি আপনাকে ArrayBuffer-> Stringথেকে ArrayBufferআবার ফিরে যেতে দেয় , যেখানে স্ট্রিংটি যেমন সংরক্ষণ করা যেতে পারে। .localStorage:)

আশাকরি এটা সাহায্য করবে,

দেনিযেল


1
আমি মনে করি না এটি একটি কার্যকর পদ্ধতি (সময় বা স্থানের নিরিখে), এবং বাইনারি ডেটা সঞ্চয় করার এটি একটি খুব অস্বাভাবিক উপায়।
কেপোজিন

@ কেপোজিন: যতদূর আমি জানি, লোকাল স্টোরেজে বাইনারি ডেটা সংরক্ষণ করার কোনও উপায় নেই
ড্যান

1
বেস 64 এনকোডিং ব্যবহার সম্পর্কে কী?
নিক সোটিরিস

13

এখানকার সমাধানগুলির বিপরীতে, আমাকে ইউটিএফ -8 ডেটা / থেকে রূপান্তর করতে হবে। এই উদ্দেশ্যে, আমি (আন) এস্কেপ / (এন) ডিকোডের ইউআরকিউম্পোনমেন্ট ট্রিকটি ব্যবহার করে নিম্নলিখিত দুটি ফাংশন কোড করেছিলাম। এগুলি মেমোরির বেশ অপব্যয়কারী, এনকোডেড ইউটিএফ 8-স্ট্রিংয়ের দৈর্ঘ্যের 9 গুন বরাদ্দ, যদিও সেগুলি জিসি দ্বারা পুনরুদ্ধার করা উচিত। 100mb পাঠ্যের জন্য কেবল এগুলি ব্যবহার করবেন না।

function utf8AbFromStr(str) {
    var strUtf8 = unescape(encodeURIComponent(str));
    var ab = new Uint8Array(strUtf8.length);
    for (var i = 0; i < strUtf8.length; i++) {
        ab[i] = strUtf8.charCodeAt(i);
    }
    return ab;
}

function strFromUtf8Ab(ab) {
    return decodeURIComponent(escape(String.fromCharCode.apply(null, ab)));
}

এটি কাজ করে তা পরীক্ষা করা হচ্ছে:

strFromUtf8Ab(utf8AbFromStr('latinкирилицаαβγδεζηあいうえお'))
-> "latinкирилицаαβγδεζηあいうえお"

8

আপনার যদি স্ট্রিংয়ে বাইনারি ডেটা থাকে ( nodejs+ readFile(..., 'binary'), বা cypress+ cy.fixture(..., 'binary')ইত্যাদি থেকে প্রাপ্ত ), আপনি ব্যবহার করতে পারবেন না TextEncoder। এটি কেবল সমর্থন করে utf8। মান সহ >= 128বাইটগুলি প্রতিটি 2 বাইটে রূপান্তরিত হয়।

ES2015:

a = Uint8Array.from(s, x => x.charCodeAt(0))

ইউিন্ট 8 আরে (33) [2, 134, 140, 186, 82, 70, 108, 182, 233, 40, 143, 247, 29, 76, 245, 206, 29, 87, 48, 160, 78, 225, 242 , 56, 236, 201, 80, 80, 152, 118, 92, 144, 48

s = String.fromCharCode.apply(null, a)

"ºRFl¶é (÷ LõÎW0 Náò8ìÉPPv \ 0"


7

আমি দেখতে পেলাম যে এই পদ্ধতির সাথে আমার সমস্যা হয়েছে, মূলত কারণ আমি কোনও ফাইলে আউটপুট লেখার চেষ্টা করছিলাম এবং এটি সঠিকভাবে এনকোড করা হয়নি। যেহেতু জেএস ইউসিএস -২ এনকোডিং ( উত্স , উত্স ) ব্যবহার করে বলে মনে হচ্ছে , তাই আমাদের এই সমাধানটি আরও একধাপ এগিয়ে প্রসারিত করতে হবে, আমার বর্ধিত সমাধানটি আমার পক্ষে কাজ করে।

জেনেরিক পাঠ্যে আমার কোনও অসুবিধা ছিল না, তবে যখন এটি আরব বা কোরিয়ান থেকে নেমেছিল তখন আউটপুট ফাইলে সমস্ত অক্ষর ছিল না তবে পরিবর্তে ত্রুটিযুক্ত অক্ষর দেখাচ্ছিল

ফাইল আউটপুট: ","10k unit":"",Follow:"Õ©íüY‹","Follow %{screen_name}":"%{screen_name}U“’Õ©íü",Tweet:"ĤüÈ","Tweet %{hashtag}":"%{hashtag} ’ĤüÈY‹","Tweet to %{name}":"%{name}U“xĤüÈY‹"},ko:{"%{followers_count} followers":"%{followers_count}…X \Ì","100K+":"100Ì tÁ","10k unit":"Ì è",Follow:"\°","Follow %{screen_name}":"%{screen_name} Ø \°X0",K:"œ",M:"1Ì",Tweet:"¸","Tweet %{hashtag}":"%{hashtag}

মূল: ","10k unit":"万",Follow:"フォローする","Follow %{screen_name}":"%{screen_name}さんをフォロー",Tweet:"ツイート","Tweet %{hashtag}":"%{hashtag} をツイートする","Tweet to %{name}":"%{name}さんへツイートする"},ko:{"%{followers_count} followers":"%{followers_count}명의 팔로워","100K+":"100만 이상","10k unit":"만 단위",Follow:"팔로우","Follow %{screen_name}":"%{screen_name} 님 팔로우하기",K:"천",M:"백만",Tweet:"트윗","Tweet %{hashtag}":"%{hashtag}

আমি ডেনিসের সমাধান থেকে এই তথ্যটি নিয়েছি এবং এই পোস্টটি খুঁজে পেয়েছি।

আমার কোডটি এখানে:

function encode_utf8(s) {
  return unescape(encodeURIComponent(s));
}

function decode_utf8(s) {
  return decodeURIComponent(escape(s));
}

 function ab2str(buf) {
   var s = String.fromCharCode.apply(null, new Uint8Array(buf));
   return decode_utf8(decode_utf8(s))
 }

function str2ab(str) {
   var s = encode_utf8(str)
   var buf = new ArrayBuffer(s.length); 
   var bufView = new Uint8Array(buf);
   for (var i=0, strLen=s.length; i<strLen; i++) {
     bufView[i] = s.charCodeAt(i);
   }
   return bufView;
 }

এটি আমাকে এনকোডিং সমস্যা ছাড়াই একটি ফাইলে সামগ্রী সংরক্ষণ করতে সহায়তা করে।

এটি কীভাবে কাজ করে: এটি মূলত একটি ইউটিএফ -8 চরিত্র রচনা করে একক 8-বাইট খণ্ড নেয় এবং এগুলিকে একক অক্ষর হিসাবে সংরক্ষণ করে (সুতরাং এইভাবে নির্মিত একটি ইউটিএফ -8 অক্ষর, এই অক্ষরগুলির 1-4 দ্বারা রচনা করা যেতে পারে)। UTF-8 দৈর্ঘ্যে 1 থেকে 4 বাইট থেকে পরিবর্তিত এমন ফর্ম্যাটে অক্ষরগুলিকে এনকোড করে। আমরা এখানে যা করি তা হ'ল একটি ইউআরআই উপাদানটিতে স্টিংকে এনকোড করা হয় এবং তারপরে এই উপাদানটি গ্রহণ করুন এবং এটি সম্পর্কিত 8 বাইট অক্ষরে অনুবাদ করুন। এইভাবে আমরা 1 টি বাইটের বেশি দীর্ঘ ইউটিএফ 8 অক্ষর দ্বারা প্রদত্ত তথ্য হারাতে পারি না।


6

যদি আপনি বিশাল অ্যারের উদাহরণ ব্যবহার করেন তবে arr.length=1000000 স্ট্যাক কলব্যাক সমস্যা এড়াতে আপনি এই কোডটি করতে পারেন

function ab2str(buf) {
var bufView = new Uint16Array(buf);
var unis =""
for (var i = 0; i < bufView.length; i++) {
    unis=unis+String.fromCharCode(bufView[i]);
}
return unis
}

বিপরীত ফাংশন ম্যাঙ্গিনি উত্তর উপরে থেকে

function str2ab(str) {
    var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
    var bufView = new Uint16Array(buf);
    for (var i=0, strLen=str.length; i<strLen; i++) {
        bufView[i] = str.charCodeAt(i);
    }
    return buf;
}

4

ঠিক আছে, এখানে একই কাজটি করার কিছুটা বিশৃঙ্খল উপায়:

var string = "Blah blah blah", output;
var bb = new (window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder)();
bb.append(string);
var f = new FileReader();
f.onload = function(e) {
  // do whatever
  output = e.target.result;
}
f.readAsArrayBuffer(bb.getBlob());

সম্পাদনা করুন: ব্লববিল্ডার দীর্ঘদিন ধরে ব্লব কনস্ট্রাক্টরের পক্ষে অবহেলা করা হয়েছে, যখন আমি এই পোস্টটি প্রথম লেখার সময় উপস্থিত ছিল না। এখানে একটি আপডেট সংস্করণ। (এবং হ্যাঁ, রূপান্তরটি করার জন্য এটি সর্বদা খুব নিরীহ উপায় হয়ে দাঁড়িয়েছে তবে এটি ছিল কেবল মজাদার জন্য!)

var string = "Blah blah blah", output;
var f = new FileReader();
f.onload = function(e) {
  // do whatever
  output = e.target.result;
};
f.readAsArrayBuffer(new Blob([string]));

3

রূপান্তরিত ArrayBufferকরার জন্য ম্যাঙ্গিনির দ্রবণ দিয়ে খেলার পরে String- ab2str(যা আমি খুঁজে পেয়েছি সবচেয়ে মার্জিত এবং দরকারী - ধন্যবাদ!), বড় অ্যারে পরিচালনা করার সময় আমার কিছু সমস্যা হয়েছিল। আরও স্পষ্টতই, কলিং String.fromCharCode.apply(null, new Uint16Array(buf));একটি ত্রুটি ছুড়ে ফেলে:

arguments array passed to Function.prototype.apply is too large

এটি সমাধান করার জন্য (বাইপাস) ArrayBufferখণ্ডগুলিতে ইনপুট হ্যান্ডেল করার সিদ্ধান্ত নিয়েছি । সুতরাং পরিবর্তিত সমাধানটি হ'ল:

function ab2str(buf) {
   var str = "";
   var ab = new Uint16Array(buf);
   var abLen = ab.length;
   var CHUNK_SIZE = Math.pow(2, 16);
   var offset, len, subab;
   for (offset = 0; offset < abLen; offset += CHUNK_SIZE) {
      len = Math.min(CHUNK_SIZE, abLen-offset);
      subab = ab.subarray(offset, offset+len);
      str += String.fromCharCode.apply(null, subab);
   }
   return str;
}

খণ্ডের আকারটি সেট করা হয়েছে 2^16কারণ আমি আমার বিকাশের ল্যান্ডস্কেপটিতে কাজ করতে এটির আকারটি পেয়েছিলাম। উচ্চতর মান নির্ধারণের ফলে একই ত্রুটিটি পুনরায় ঘটতে পারে। CHUNK_SIZEভেরিয়েবলটিকে অন্য একটি মানকে সেট করে এটি পরিবর্তন করা যেতে পারে । একটি সমান সংখ্যা থাকা জরুরী।

কর্মক্ষমতা সম্পর্কে নোট - আমি এই সমাধানের জন্য কোনও পারফরম্যান্স পরীক্ষা করিনি। তবে এটি যেহেতু পূর্ববর্তী সমাধানের উপর ভিত্তি করে, এবং বড় অ্যারে পরিচালনা করতে পারে, তাই এটি ব্যবহার না করার কোনও কারণ আমি দেখতে পাচ্ছি না।


আপনি টাইপডারে.সুবারে ব্যবহার করতে পারেন নির্দিষ্ট অবস্থান এবং আকারে অংশ নিতে, আমি জেএসে বাইনারি ফর্ম্যাটগুলি থেকে হেডারগুলি পড়তে যা করি
নিকোস এম।

2

এখানে দেখুন: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays/StringView (জাভাস্ক্রিপ্ট অ্যারেবফার ইন্টারফেসের উপর ভিত্তি করে স্ট্রিংগুলির জন্য একটি সি-এর মতো ইন্টারফেস)


2
এই কোডটি জিপিএলভি 3 এর অধীনে। আমি মনে করি যে এই কোডটি তাদের মান-সম্মতিযুক্ত ডকুমেন্টেশনের সাথে মিশ্রিত করা মজিলার বেশ অপেশাদারী।
ব্যবহারকারী 239558

2
  stringToArrayBuffer(byteString) {
    var byteArray = new Uint8Array(byteString.length);
    for (var i = 0; i < byteString.length; i++) {
      byteArray[i] = byteString.codePointAt(i);
    }
    return byteArray;
  }
  arrayBufferToString(buffer) {
    var byteArray = new Uint8Array(buffer);
    var byteString = '';
    for (var i = 0; i < byteArray.byteLength; i++) {
      byteString += String.fromCodePoint(byteArray[i]);
    }
    return byteString;
  }

স্ট্রিংটিতে ইউনিকোডের অক্ষর থাকলে এই কোডটি বগী। উদাহরণস্বরূপ:arrayBufferToString(stringToArrayBuffer('🐴'))==='44'
xmcp

2

নোড.জেএস এবং ব্রাউজারগুলির জন্যও https://github.com/feross/buffer ব্যবহার করুন

function ab2str(buf: Uint8Array) {
  return Buffer.from(buf).toString('base64');
}
function str2ab(str: string) {
  return new Uint8Array(Buffer.from(str, 'base64'))
}

দ্রষ্টব্য: এখানে সমাধানগুলি আমার পক্ষে কার্যকর হয়নি। আমার নোড.জেএস এবং ব্রাউজারগুলি সমর্থন করতে হবে এবং কেবল ইউআইএনটি 8আরিকে একটি স্ট্রিংয়ে সিরিয়ালাইজ করতে হবে। আমি এটি একটি সংখ্যা হিসাবে সিরিয়াল করতে পারি [] তবে এটি অপ্রয়োজনীয় স্থান দখল করে। এই সমাধানের সাথে আমার এনকোডিংগুলি সম্পর্কে ভিত্তি করে to ঠিক যদি অন্য লোকেরাও একই সমস্যা নিয়ে লড়াই করে ... আমার দুই সেন্ট


2

ধরা যাক আপনার একটি অ্যারে বাফার বাইনারিএসআর রয়েছে:

let text = String.fromCharCode.apply(null, new Uint8Array(binaryStr));

এবং তারপরে আপনি রাজ্যে পাঠ্যটি বরাদ্দ করেন।


1

"নেটিভ" বাইনারি স্ট্রিং যা অটোব () প্রত্যাবর্তন করে তা হ'ল প্রতি-অক্ষর অ্যারে 1 বাইট।

সুতরাং আমরা একটি অক্ষরে 2 বাইট সংরক্ষণ করা উচিত নয়।

var arrayBufferToString = function(buffer) {
  return String.fromCharCode.apply(null, new Uint8Array(buffer));
}

var stringToArrayBuffer = function(str) {
  return (new Uint8Array([].map.call(str,function(x){return x.charCodeAt(0)}))).buffer;
}


0

আমি ব্লববিল্ডারের মতো অবহেলিত এপিআই ব্যবহার না করার পরামর্শ দেব

ব্লববিল্ডার দীর্ঘদিন ধরে ব্লব অবজেক্টের দ্বারা অবহেলিত। ডেনিসের উত্তরে কোডটির সাথে তুলনা করুন - যেখানে ব্লববিল্ডার ব্যবহৃত হয়েছে - নীচের কোডটির সাথে:

function arrayBufferGen(str, cb) {

  var b = new Blob([str]);
  var f = new FileReader();

  f.onload = function(e) {
    cb(e.target.result);
  }

  f.readAsArrayBuffer(b);

}

এটিকে কতটা পরিষ্কার এবং কম স্ফীতিত হ্রাস করা হয়েছে তা অবহেলা পদ্ধতির সাথে তুলনা করা হয়েছে ... হ্যাঁ, এটি অবশ্যই এখানে বিবেচনা করার মতো বিষয়।


মানে, হ্যাঁ, তবে ব্লব কনস্ট্রাক্টরটি 2012 সালে সত্যিই ব্যবহারযোগ্য ছিল না;)
জেংকেভ


0

আমি এটি ব্যবহার করেছি এবং আমার জন্য কাজ করে।

function arrayBufferToBase64( buffer ) {
    var binary = '';
    var bytes = new Uint8Array( buffer );
    var len = bytes.byteLength;
    for (var i = 0; i < len; i++) {
        binary += String.fromCharCode( bytes[ i ] );
    }
    return window.btoa( binary );
}



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