বাইনারি নোডজেএস বাফারকে জাভাস্ক্রিপ্ট অ্যারেবফারে রূপান্তর করুন


133

আমি কীভাবে কোনও নোডজেএস বাইনারি বাফারটিকে জাভাস্ক্রিপ্ট অ্যারেবফারে রূপান্তর করতে পারি?


1
আমি কেন আগ্রহী যে আপনার এটি করা দরকার কেন?
ক্রিস বিস্কার্ডি

14
একটি ভাল উদাহরণ কোনও লাইব্রেরি লিখতে হবে যা ফাইলগুলির ব্রাউজারগুলিতে এবং নোডজেএস ফাইলগুলির সাথে কাজ করে?
fbstj


1
আরেকটি কারণ হ'ল একটি ফ্লোটে র‍্যামের অনেকগুলি বাইট লাগে যখন একটিতে সঞ্চিত থাকে Array। সুতরাং অনেকগুলি ফ্লোট সংরক্ষণ করতে আপনার Float32Arrayএটি যেখানে 4 বাইট লাগে লাগে। এবং যদি আপনি সেই ফাইলগুলিতে দ্রুত সিরিয়ালাইজেশন চান তবে আপনার দরকার একটি Bufferজেএসওএনকে ক্রমিকায়িত করতে যুগে যুগে লাগে।
এনপোনকপোক

আমি ওয়েবআরটিটিসি ব্যবহার করে জেনেরিক ডেটা প্রেরণ করতে ঠিক একই জিনিসটি জানতে চাই এবং এটি অবিশ্বাস্য যে এখানে
এতগুলি

উত্তর:


134

এর দৃষ্টান্ত Bufferএছাড়াও উদাহরণ স্বরূপ ধরেUint8Array Node.js 4.x এবং উচ্চতর হবে। সুতরাং, সবচেয়ে কার্যকর সমাধানটি হ'ল https://stackoverflow.com/a/31394257/1375574 অনুসারে buf.bufferসম্পত্তিটি সরাসরি অ্যাক্সেস করা । আপনার যদি অন্য দিকে যেতে হয় তবে বাফার কনস্ট্রাক্টরও অ্যারেবফারভিউ যুক্তিটি গ্রহণ করে।

নোট করুন যে এটি কোনও অনুলিপি তৈরি করবে না, যার অর্থ যে কোনও অ্যারেবফারভিউতে লিখেছে তা মূল বাফার দৃষ্টিতে লিখবে।


পুরানো সংস্করণগুলিতে, নোড.জেএস-এ ভি 8 এর অংশ হিসাবে উভয় অ্যারেবফার রয়েছে তবে বাফার শ্রেণি আরও নমনীয় এপিআই সরবরাহ করে। একটি অ্যারে বাফার পড়তে বা লিখতে আপনাকে কেবল একটি ভিউ তৈরি করতে হবে এবং অনুলিপিটি অনুলিপি করতে হবে।

বাফার থেকে অ্যারেবফার:

function toArrayBuffer(buf) {
    var ab = new ArrayBuffer(buf.length);
    var view = new Uint8Array(ab);
    for (var i = 0; i < buf.length; ++i) {
        view[i] = buf[i];
    }
    return ab;
}

অ্যারেবফার থেকে বাফার:

function toBuffer(ab) {
    var buf = Buffer.alloc(ab.byteLength);
    var view = new Uint8Array(ab);
    for (var i = 0; i < buf.length; ++i) {
        buf[i] = view[i];
    }
    return buf;
}

5
আমি ডেটাভিউ ব্যবহার করে যখন সম্ভব পূর্ণসংখ্য অনুলিপি করে এটি অনুকূলকরণ করার পরামর্শ দিই to অবধি size&0xfffffffe, 32-বিট পূর্ণসংখ্যা অনুলিপি করুন, তারপরে, যদি 1 বাইট বাকী থাকে তবে 8-বিট পূর্ণসংখ্য অনুলিপি করুন, যদি 2 বাইট হয়, 16-বিট পূর্ণসংখ্য অনুলিপি করুন এবং 3 বাইট, 16-বিট এবং 8-বিট পূর্ণসংখ্য অনুলিপি করুন।
ট্রায়ানগ

3
এর অর্ধেকের সরল বাস্তবায়নের জন্য ক্রেগ 22 এর উত্তর দেখুন।
অরেঞ্জডোগ

ব্রাউজার ব্যবহারের উদ্দেশ্যে তৈরি মডিউলটি দিয়ে বাফার -> অ্যারেবফার পরীক্ষা করে দেখেছেন এবং এটি দুর্দান্তভাবে কাজ করছে। ধন্যবাদ!
pospi

3
কেন abফিরিয়ে দেওয়া হচ্ছে? এর সাথে কিছুই হয় না ab? আমি সবসময় {}ফলাফল হিসাবে পেতে ।
অ্যান্ডি গিগা

1
' slice()পদ্ধতিটি ArrayBufferএমন একটি নতুনকে ফেরত দেয় যার বিষয়বস্তু এই ArrayBufferপ্রারম্ভিক, সমেত, শেষ অবধি, একচেটিয়া থেকে বাইটগুলির অনুলিপি ।' - MDNArrayBuffer.prototype.slice()
Константин

61

কোনও নির্ভরতা নেই, দ্রুততম, নোড.জেএস 4.x এবং তার পরে

Buffers গুলি Uint8Arrays, সুতরাং আপনাকে কেবল সমর্থন করার অঞ্চলটি টুকরো টুকরো করে (অনুলিপি করতে হবে) ArrayBuffer

// Original Buffer
let b = Buffer.alloc(512);
// Slice (copy) its segment of the underlying ArrayBuffer
let ab = b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength);

sliceএবং অফসেট উপাদান প্রয়োজনীয় কারণ ছোট Bufferগুলি (ডিফল্টরূপে কম 4 kB র, অর্ধেক পুকুর আকার ) একটি ভাগ নিয়ে দৃষ্টিভঙ্গি হতে পারে ArrayBuffer। টুকরো টুকরো না করে, আপনি ArrayBufferঅন্যের একটিযুক্ত ডেটা দিয়ে শেষ করতে পারেন Buffer। ডক্সে ব্যাখ্যা দেখুন ।

আপনার যদি শেষ পর্যন্ত কোনও প্রয়োজন হয় TypedArray, আপনি ডেটা অনুলিপি না করে একটি তৈরি করতে পারেন:

// Create a new view of the ArrayBuffer without copying
let ui32 = new Uint32Array(b.buffer, b.byteOffset, b.byteLength / Uint32Array.BYTES_PER_ELEMENT);

কোনও নির্ভরতা, মাঝারি গতি, নোড.জেএস এর কোনও সংস্করণ নেই

মার্টিন থমসনের উত্তরটি ব্যবহার করুন যা ও (এন) সময়ে চলে। (অপ-অপ্টিমাইজেশন সম্পর্কে তার উত্তর সম্পর্কে মন্তব্যে আমার জবাবগুলি দেখুন। একটি ডেটাভিউ ব্যবহার করা ধীর গতির you

নির্ভরতা, দ্রুত, নোড.জেএস ≤ 0.12 বা iojs 3.x

আপনি উভয় দিক (বাফার টু অ্যারেবফার এবং পিছনে) যেতে https://www.npmjs.com/package/memcpy ব্যবহার করতে পারেন । এটি এখানে পোস্ট করা অন্যান্য উত্তরগুলির চেয়ে দ্রুত এবং এটি একটি লিখিত গ্রন্থাগার। Iojs মাধ্যমে নোড 0.12 3.x এর (দেখুন ngossen প্রয়োজন কাঁটাচামচ এই )।


এটি আবার নোড> 0.12
পাওয়েল ভেসেলভ

1
এনগোসেনের কাঁটাচামচ ব্যবহার করুন: github.com/dcodeIO/node-memcpy/pull/6 । আপনি নোড 4+ ব্যবহার করছেন তবে আমার নতুন উত্তরটিও দেখুন।
ZachB

কোথায় .byteLengthএবং .byteOffsetডকুমেন্টেড ছিল?
28

1
@ কে ._ সেই বৈশিষ্ট্যগুলি টাইপড অ্যারে থেকে উত্তরাধিকারসূত্রে প্রাপ্ত: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স/… এবং বিকাশকারী.মোজিলা.আর।
ZachB

1
var ab = b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength);আমার দিন বাঁচিয়েছে
আলেক্সি শ।

55

"অ্যারেবফার থেকে বাফার পর্যন্ত" এভাবে করা যেতে পারে:

var buffer = Buffer.from( new Uint8Array(ab) );

27
ওপি যা চেয়েছিল তার বিপরীতে।
আলেকজান্ডার গনচি

42
তবে এটাই আমি আমার সমস্যাটি গুগল করতে চেয়েছিলাম এবং আমি সমাধানটি খুঁজে পেয়েছি found
ম্যাকিয়েজ ক্রাভজাইক

27

এটি লেখার একটি দ্রুত উপায়

var arrayBuffer = new Uint8Array(nodeBuffer).buffer;

তবে এটি 1024 উপাদান সহ একটি বাফারে অ্যারেবফার ফাংশনটির প্রস্তাবিত তুলনায় প্রায় 4 গুণ কম ধীরে চলবে বলে মনে হয়।


3
দেরীতে সংযোজন: @ ট্র্যাভনোরিস বলেছেন "শুরু হচ্ছে [ভি 8] ৪.৩ বাফাররা ইউন্ট ৮আরাই সমর্থন করেছেন", তাই সম্ভবত এটি এখন আরও দ্রুত ...
ক্রিসভি

এটি করার নিরাপদ উপায়ে আমার উত্তরটি দেখুন।
জ্যাচবি

3
এটি v5.6.0 দিয়ে পরীক্ষা করেছে এবং এটি ছিল দ্রুততম
daksh_019

1
এটি কেবলমাত্র কাজ করে কারণ উদাহরণস্বরূপ নোড.জেএস ৪.x এবং এর চেয়েও বেশি Bufferউদাহরণ রয়েছে Uint8Array। নিম্ন নোড.জেএস সংস্করণগুলির জন্য আপনাকে একটি toArrayBufferফাংশন প্রয়োগ করতে হবে ।
বেনি নিউজবাউয়ার

14

1. Bufferএটিকে দেখার জন্য একটি দৃশ্যArrayBuffer

একজন Buffer, আসলে, একটি হল FastBuffer, যা extends(থেকে উত্তরাধিকারী) Uint8Array, যা একটি অক্টেট-একক দৃশ্য প্রকৃত মেমরি, একটি এর ( "আংশিক অ্যাকসেসর") ArrayBuffer

  Ode নোড.জেএস 9.4.0/lib/buffer.js#L65-L73
class FastBuffer extends Uint8Array {
  constructor(arg1, arg2, arg3) {
    super(arg1, arg2, arg3);
  }
}
FastBuffer.prototype.constructor = Buffer;
internalBuffer.FastBuffer = FastBuffer;

Buffer.prototype = FastBuffer.prototype;

২.এর ArrayBufferআকার এবং এর দেখার আকার পৃথক হতে পারে।

কারণ # 1: Buffer.from(arrayBuffer[, byteOffset[, length]])

এর সাথে Buffer.from(arrayBuffer[, byteOffset[, length]]), আপনি Bufferএর অন্তর্নিহিত ArrayBufferএবং দর্শনের অবস্থান এবং আকার নির্দিষ্ট করে একটি তৈরি করতে পারেন ।

const test_buffer = Buffer.from(new ArrayBuffer(50), 40, 10);
console.info(test_buffer.buffer.byteLength); // 50; the size of the memory.
console.info(test_buffer.length); // 10; the size of the view.

কারণ # 2: FastBufferএর স্মৃতি বরাদ্দ।

এটি আকারের উপর নির্ভর করে মেমরিটিকে দুটি পৃথক উপায়ে বরাদ্দ করে।

  • যদি মেমরি পুলের আকারের অর্ধেকের চেয়ে কম হয় এবং 0 ("ছোট") না হয় : এটি প্রয়োজনীয় মেমরিটি প্রস্তুত করতে একটি মেমরি পুল ব্যবহার করে ।
  • অন্য : এটি এমন একটি উত্সর্গীকৃত তৈরি করে ArrayBufferযা সঠিকভাবে প্রয়োজনীয় স্মৃতিতে ফিট করে।
  Ode নোড.জেএস 9.4.0/lib/buffer.js#L306-L320
function allocate(size) {
  if (size <= 0) {
    return new FastBuffer();
  }
  if (size < (Buffer.poolSize >>> 1)) {
    if (size > (poolSize - poolOffset))
      createPool();
    var b = new FastBuffer(allocPool, poolOffset, size);
    poolOffset += size;
    alignPool();
    return b;
  } else {
    return createUnsafeBuffer(size);
  }
}
  Ode নোড.জেএস 9.4.0/lib/buffer.js#L98-L100
function createUnsafeBuffer(size) {
  return new FastBuffer(createUnsafeArrayBuffer(size));
}

একটি " মেমরি পুল " বলতে কী বোঝ ?

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

এই ক্ষেত্রে, মেমরি পুলগুলি ArrayBufferহ'ল ডিফল্টরূপে যার আকার 8 কিবি, যা নির্দিষ্ট করা আছে Buffer.poolSize। এটি যখন একটির জন্য একটি ছোট আকারের মেমরির অংশ সরবরাহ করে Buffer, এটি পরীক্ষা করে যে শেষ মেমরি পুলটিতে এটি পরিচালনা করার জন্য পর্যাপ্ত উপলব্ধ মেমরি রয়েছে কিনা; যদি তাই হয়, এটি একটি সৃষ্টি Bufferযে "মতামত" মেমরি পুল প্রদত্ত আংশিক খণ্ড, অন্যথায় যে এটা একটা নতুন মেমরির পুকুর ইত্যাদি সৃষ্টি করে।


আপনি ArrayBufferএকটি এর অন্তর্নিহিত অ্যাক্সেস করতে পারেন BufferBufferএর bufferসম্পত্তি (যে, থেকে উত্তরাধিকারসূত্রে Uint8Array) এটি ঝুলিতে। একটি "ছোট" Buffer এর bufferসম্পত্তি হ'ল ArrayBufferসম্পূর্ণ মেমরি পুলকে উপস্থাপন করে। তাই এই ক্ষেত্রে, ArrayBufferএবং Bufferআকার পরিবর্তিত হয়।

const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);

// A `Buffer`'s `length` property holds the size, in octets, of the view.
// An `ArrayBuffer`'s `byteLength` property holds the size, in octets, of its data.

console.info(zero_sized_buffer.length); /// 0; the view's size.
console.info(zero_sized_buffer.buffer.byteLength); /// 0; the memory..'s size.
console.info(Buffer.poolSize); /// 8192; a memory pool's size.

console.info(small_buffer.length); /// 3; the view's size.
console.info(small_buffer.buffer.byteLength); /// 8192; the memory pool's size.
console.info(Buffer.poolSize); /// 8192; a memory pool's size.

console.info(big_buffer.length); /// 4096; the view's size.
console.info(big_buffer.buffer.byteLength); /// 4096; the memory's size.
console.info(Buffer.poolSize); /// 8192; a memory pool's size.

৩. সুতরাং আমাদের এটিকে " ভিউগুলি " হিসাবে স্মৃতি বের করতে হবে ।

একটি ArrayBufferআকারে স্থির হয়, তাই আমাদের অংশটির একটি অনুলিপি তৈরি করে তা বের করতে হবে। এই কাজের জন্য, আমরা ব্যবহার Bufferএর byteOffsetসম্পত্তি এবং lengthসম্পত্তি , যা সুত্রে প্রাপ্ত Uint8Array, এবং পদ্ধতি , যা একটি একটি অংশ একটি কপি করে তোলে । এখানে- পদ্ধতিটি @ জাচবি দ্বারা অনুপ্রাণিত হয়েছিল ।ArrayBuffer.prototype.sliceArrayBufferslice()

const test_buffer = Buffer.from(new ArrayBuffer(10));
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);

function extract_arraybuffer(buf)
{
    // You may use the `byteLength` property instead of the `length` one.
    return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);
}

// A copy -
const test_arraybuffer = extract_arraybuffer(test_buffer); // of the memory.
const zero_sized_arraybuffer = extract_arraybuffer(zero_sized_buffer); // of the... void.
const small_arraybuffer = extract_arraybuffer(small_buffer); // of the part of the memory.
const big_arraybuffer = extract_arraybuffer(big_buffer); // of the memory.

console.info(test_arraybuffer.byteLength); // 10
console.info(zero_sized_arraybuffer.byteLength); // 0
console.info(small_arraybuffer.byteLength); // 3
console.info(big_arraybuffer.byteLength); // 4096

4. কর্মক্ষমতা উন্নতি

আপনি যদি ফলাফলগুলি কেবল পঠন হিসাবে ব্যবহার করতে চান, বা ইনপুটগুলির Bufferবিষয়বস্তুগুলি সংশোধন করা ঠিক আছে , আপনি অপ্রয়োজনীয় স্মৃতি অনুলিপি এড়াতে পারবেন।

const test_buffer = Buffer.from(new ArrayBuffer(10));
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);

function obtain_arraybuffer(buf)
{
    if(buf.length === buf.buffer.byteLength)
    {
        return buf.buffer;
    } // else:
    // You may use the `byteLength` property instead of the `length` one.
    return buf.subarray(0, buf.length);
}

// Its underlying `ArrayBuffer`.
const test_arraybuffer = obtain_arraybuffer(test_buffer);
// Just a zero-sized `ArrayBuffer`.
const zero_sized_arraybuffer = obtain_arraybuffer(zero_sized_buffer);
// A copy of the part of the memory.
const small_arraybuffer = obtain_arraybuffer(small_buffer);
// Its underlying `ArrayBuffer`.
const big_arraybuffer = obtain_arraybuffer(big_buffer);

console.info(test_arraybuffer.byteLength); // 10
console.info(zero_sized_arraybuffer.byteLength); // 0
console.info(small_arraybuffer.byteLength); // 3
console.info(big_arraybuffer.byteLength); // 4096

4
এটি সব ভাল এবং ভাল ... তবে আপনি কি আসলে ওপির প্রশ্নের উত্তর দিয়েছেন? যদি আপনি করেন তবে এটি সমাধিস্থ হয়েছে ...
টাস্টিন 2121

দুর্দান্ত উত্তর! ইন obtain_arraybuffer: buf.buffer.subarrayঅস্তিত্ব আছে বলে মনে হয় না। তুমি buf.buffer.sliceএখানে বলতে চাচ্ছ ?
প্রতিদিনের উত্পাদনশীল

প্রত্যেকটি দিন প্রজননমূলক ধন্যবাদ আপনাকে ধন্যবাদ আপনি সম্পাদনা ইতিহাসে দেখতে পাচ্ছেন, আমি আসলে ব্যবহার করেছি ArrayBuffer.prototype.sliceএবং পরে এটিতে পরিবর্তন করেছি Uint8Array.prototype.subarray। ওহ, এবং আমি এটা ভুল করেছি। সম্ভবত ফিরে কিছুটা বিভ্রান্ত হয়েছিল। এখনই সব ঠিক আছে আপনাকে ধন্যবাদ।
Ван

12

নিম্নলিখিত চমৎকার npm প্যাকেজ ব্যবহার করুন: to-arraybuffer

অথবা, আপনি নিজেই এটি প্রয়োগ করতে পারেন। যদি আপনার বাফারকে কল করা হয় bufতবে এটি করুন:

buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)


1

ArrayBufferটাইপ করা হিসাবে আপনি ভাবতে পারেন Buffer

একটি ArrayBufferঅতএব সবসময় একটি প্রকার (তথাকথিত "এরে বাফার দেখুন") প্রয়োজন। সাধারণত অ্যারে বাফার ভিউতে এক ধরণের Uint8Arrayবা থাকে Uint16Array

একটি অ্যারেবফার এবং একটি স্ট্রিংয়ের মধ্যে রূপান্তর করার বিষয়ে রেনাটো ম্যাঙ্গিনি থেকে একটি ভাল নিবন্ধ রয়েছে

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

function stringToArrayBuffer(string) {
  const arrayBuffer = new ArrayBuffer(string.length);
  const arrayBufferView = new Uint8Array(arrayBuffer);
  for (let i = 0; i < string.length; i++) {
    arrayBufferView[i] = string.charCodeAt(i);
  }
  return arrayBuffer;
}

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

const helloWorld = stringToArrayBuffer('Hello, World!'); // "ArrayBuffer" (Uint8Array)
const encodedString = new Buffer(helloWorld).toString('base64'); // "string"
const decodedBuffer = Buffer.from(encodedString, 'base64'); // "Buffer"
const decodedArrayBuffer = new Uint8Array(decodedBuffer).buffer; // "ArrayBuffer" (Uint8Array)

console.log(arrayBufferToString(decodedArrayBuffer)); // prints "Hello, World!"

0

আমি উপরের ফ্লোট 64 অ্যারির জন্য চেষ্টা করেছিলাম এবং এটি কার্যকর হয়নি।

আমি বুঝতে পেরেছিলাম যে সত্যিকারের ডেটা সঠিক খণ্ডে ভিউ 'INTO' পড়তে হবে। এর অর্থ সোর্স বাফার থেকে একবারে 8 বাইট পড়া।

যাইহোক, এটাই আমি শেষ করেছি ...

var buff = new Buffer("40100000000000004014000000000000", "hex");
var ab = new ArrayBuffer(buff.length);
var view = new Float64Array(ab);

var viewIndex = 0;
for (var bufferIndex=0;bufferIndex<buff.length;bufferIndex=bufferIndex+8)            {

    view[viewIndex] = buff.readDoubleLE(bufferIndex);
    viewIndex++;
}

এই কারণেই মার্টিন থমসনের উত্তরটিতে ইউন্ট 8আরাই ব্যবহার করা হয়েছে - এটি উপাদানগুলির আকারের অজানা। Buffer.read*পদ্ধতি সব ধীরগতি করে।
জ্যাচবি

একাধিক টাইপযুক্ত অ্যারে দর্শন একই মেমরিটি ব্যবহার করে একই অ্যারে বুফারটিকে উল্লেখ করতে পারে। বাফারের প্রতিটি মান একটি বাইট হয়, সুতরাং আপনাকে এটিকে 1 বাইটের উপাদান আকারের একটি অ্যারেতে রাখা দরকার। আপনি মার্টিনের পদ্ধতিটি ব্যবহার করতে পারেন, তারপরে কনস্ট্রাক্টরে একই অ্যারেবুফারটি ব্যবহার করে একটি নতুন ফ্ল্যাট 64 আরে তৈরি করুন।
ZachB

0

এই প্রক্সিটি কোনও অনুলিপি ছাড়াই টাইফার্ডআরেগুলির কোনও হিসাবে বাফারকে প্রকাশ করবে। :

https://www.npmjs.com/package/node-buffer-as-typedarray

এটি কেবল এলই-তে কাজ করে তবে সহজেই বিই তে পোর্ট করা যায়। এছাড়াও, আসলে এটি কতটা কার্যকর তা পরীক্ষার জন্য কখনই পাওয়া যায়নি।


1
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত উত্তরগুলি যদি লিঙ্কযুক্ত পৃষ্ঠাটি পরিবর্তন করে তবে অবৈধ হয়ে উঠতে পারে
koceeng

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

0

এখন এটির জন্য খুব দরকারী এনপিএম প্যাকেজ রয়েছে: buffer https://github.com/feross/buffer

এটি এমন একটি API সরবরাহ করার চেষ্টা করে যা নোডের বাফার এপিআইয়ের সাথে 100% অভিন্ন এবং মঞ্জুরি দেয়:

এবং আরও কিছু।


-1

নোডজেএস, এক পর্যায়ে (আমি মনে করি এটি v0.6.x বলে মনে হয়েছিল) এর অ্যারেবফার সমর্থন ছিল। আমি এখানে বেস 64 এনকোডিং এবং ডিকোডিংয়ের জন্য একটি ছোট লাইব্রেরি তৈরি করেছি , তবে v0.7 এ আপডেট করার পরে, পরীক্ষাগুলি (নোডজেএস-এ) ব্যর্থ হয়। আমি এমন কিছু তৈরি করার কথা ভাবছি যা এটিকে স্বাভাবিক করে তোলে তবে আমি মনে করি নোডের স্থানীয় Bufferব্যবহার করা উচিত।


-6

আমি ইতিমধ্যে আমার নোডটি 5.0.0 সংস্করণে আপডেট করেছি এবং আমি এটি নিয়ে কাজ করি:

function toArrayBuffer(buffer){
    var array = [];
    var json = buffer.toJSON();
    var list = json.data

    for(var key in list){
        array.push(fixcode(list[key].toString(16)))
    }

    function fixcode(key){
        if(key.length==1){
            return '0'+key.toUpperCase()
        }else{
            return key.toUpperCase()
        }
    }

    return array
}

আমি আমার ভিএইচডি ডিস্ক চিত্রটি পরীক্ষা করতে এটি ব্যবহার করি।


এটিকে দেখে মনে হচ্ছে একটি বিশেষায়িত (এবং ধীর) সিরিয়ালাইজেশন ভিত্তিক পদ্ধতির মতো, বাফার / অ্যারেবফারকে / থেকে রূপান্তর করার জন্য জেনেরিক পদ্ধতি নয়?
জ্যাচবি

@ জাচবি এটি ভি 5.0.0 + [কেবল] = = এর জন্য জেনেরিক পদ্ধতি।
মিগুয়েল ভ্যালেন্টাইন

toArrayBuffer(new Buffer([1,2,3]))-> ['01', '02', '03']- এটি পূর্ণসংখ্যার / বাইট নয়, স্ট্রিংগুলির একটি অ্যারের ফিরিয়ে দিচ্ছে।
ZachB

@ জাচবি রিটার্ন অ্যারে -> রিটার্নের তালিকা। আমি স্টাডাউটের জন্য অন্তঃ> স্ট্রিংটি ঠিক করেছি
মিগুয়েল ভ্যালেন্টাইন

সেক্ষেত্রে এটি স্ট্যাকওভারফ্লো.com / a / 19544002 / 1218408 এর সমান এবং এখনও স্ট্যাকওভারফ্লো . com/a/31394257/1218408 এ বাইট অফসেট চেক ছাড়াই প্রয়োজনীয় ।
ZachB
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.