बाइनरी NodeJS बफर को जावास्क्रिप्ट ArrayBuffer में बदलें


133

मैं एक NodeJS बाइनरी बफर को जावास्क्रिप्ट ऐरेबफ़र में कैसे बदल सकता हूं?


1
मैं उत्सुक हूं कि आपको ऐसा करने की आवश्यकता क्यों होगी?
क्रिस बिस्कार्डी

14
एक अच्छा उदाहरण एक पुस्तकालय लिखना होगा जो फ़ाइल के ब्राउज़रों के साथ और NodeJS फ़ाइलों के लिए भी काम करता है?
fbstj

1
या NodeJS
OrangeDog

1
एक और कारण यह है कि एक फ्लोट रैम के बहुत सारे बाइट्स लेता है जब एक में संग्रहीत किया जाता है Array। तो कई फ्लोट्स को स्टोर करने के लिए Float32Arrayजहां आपको 4 बाइट्स की आवश्यकता होती है और अगर आप चाहते हैं कि उन फाइल के लिए त्वरित क्रमांकन आपको एक फ़ाइल की आवश्यकता हो Buffer, जैसा कि JSON को क्रमबद्ध करने में उम्र लगती है।
nponeccop

मैं वेबआरटीसी का उपयोग करके जेनेरिक डेटा भेजने के लिए बिल्कुल एक ही बात जानना चाहता हूं और यह अविश्वसनीय है कि यहां बहुत सारे उत्तर इतने सारे पसंद हैं, लेकिन वास्तविक सवाल का जवाब नहीं देते ...
फेलिक्स क्रैज़ोलारा

जवाबों:


134

के उदाहरण BufferभीUint8Array नोड्स में उदाहरण हैं । 4.s और अधिक। इस प्रकार, सबसे कुशल समाधान https://stackoverflow.com/a/31394257/1375774 केbuf.buffer अनुसार सीधे संपत्ति तक पहुंचना है । यदि आपको अन्य दिशा में जाने की आवश्यकता है, तो बफ़र कंस्ट्रक्टर एक ArrayBufferView तर्क भी लेता है।

ध्यान दें कि यह एक प्रतिलिपि नहीं बनाएगा, जिसका अर्थ है कि किसी भी ArrayBufferView को लिखते हैं जो मूल बफर उदाहरण के माध्यम से लिखेंगे।


पुराने संस्करणों में, नोड .js में v8 के हिस्से के रूप में दोनों ArrayBuffer है, लेकिन बफर वर्ग एक अधिक लचीला एपीआई प्रदान करता है। ArrayBuffer को पढ़ने या लिखने के लिए, आपको केवल एक दृश्य बनाना होगा और उस पर प्रतिलिपि बनानी होगी।

बफ़र से ArrayBuffer तक:

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;
}

ArrayBuffer से बफ़र तक:

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
मैं आपको यह भी सलाह दे सकता हूं कि DataView का उपयोग करते समय पूर्णांकों की प्रतिलिपि बनाकर इसे ऑप्टिमाइज़ करें। तब तक size&0xfffffffe, 32-बिट पूर्णांक कॉपी करें, फिर, यदि 1 बाइट शेष है, तो 8-बिट पूर्णांक कॉपी करें, यदि 2 बाइट्स, 16-बिट पूर्णांक कॉपी करें, और यदि 3 बाइट्स, 16-बिट और 8-बिट पूर्णांक की प्रतिलिपि बनाएँ।
त्रिकोणीय 3

3
इस के आधे के एक सरल कार्यान्वयन के लिए kraag22 का जवाब देखें।
ऑरेंजडॉग

बफ़र का परीक्षण किया है -> ब्राउज़र उपयोग के लिए एक मॉड्यूल के साथ ArrayBuffer और यह शानदार ढंग से काम कर रहा है। धन्यवाद!
पोस्पी

3
क्यों abलौटाया जाता है? के साथ कुछ भी नहीं किया है ab? मैं हमेशा {}एक परिणाम के रूप में मिलता है ।
एंडी गीगा

1
' slice()विधि एक नया देता है ArrayBufferजिसकी सामग्री इस ArrayBufferबाइट की एक प्रति है जो शुरू से, समावेशी, अंत तक, अनन्य है।' - एमडीएनArrayBuffer.prototype.slice()
Константин Ван

61

कोई निर्भरता, सबसे तेज, Node.js 4.x और बाद में

Buffers s हैं Uint8Array, इसलिए आपको बस इसके बैकिंग के क्षेत्र को स्लाइस (कॉपी) करना होगा 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);

कोई निर्भरता, मध्यम गति, Node.js का कोई भी संस्करण

मार्टिन थॉमसन के उत्तर का उपयोग करें , जो ओ (एन) समय में चलता है । (गैर-अनुकूलन के बारे में उनके जवाब पर टिप्पणियों के लिए मेरे उत्तर भी देखें। डेटा व्यू का उपयोग करना धीमा है। भले ही आपको बाइट्स फ्लिप करने की आवश्यकता हो, ऐसा करने के लिए तेज़ तरीके हैं।)

निर्भरता, तेज, Node.js or 0.12 या iojs 3.x

आप किसी भी दिशा में जाने के लिए https://www.npmjs.com/package/memcpy का उपयोग कर सकते हैं (बफ़र से ArrayBuffer और वापस)। यह यहां पोस्ट किए गए अन्य उत्तरों की तुलना में तेज़ है और एक अच्छी तरह से लिखित पुस्तकालय है। Iojs के माध्यम से नोड 0.12 3.x के (देखें ngossen की आवश्यकता होती है कांटा इस )।


यह फिर से नोड संकलित नहीं करता है> 0.12
पावेल वेसेलोव 3

1
एनकोसेन के कांटे का उपयोग करें: github.com/dcodeIO/node-memcpy/pull/6 । यदि आप नोड 4+ का उपयोग कर रहे हैं तो मेरा नया उत्तर भी देखें।
ZachB 19

.byteLengthऔर .byteOffsetदस्तावेज कहां थे ?
Константин Ван

1
@ K._ वे गुण TypedArray से विरासत में मिले: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… और developer.mozilla.org/en-US/docs/Web-JavaScript/Reference/…
ZachB

1
var ab = b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength);मेरा दिन बचाया
एलेक्सी श।

56

"ArrayBuffer से बफ़र तक" इस तरह किया जा सकता है:

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

27
यह वही है जो ओपी चाहता था।
अलेक्जेंडर गोंचिए

43
लेकिन यही है कि मैं अपनी समस्या को हल करना चाहता था और मुझे इसका समाधान मिल गया।
मैकीज क्रैस्कीज

27

इसे लिखने का एक तेज तरीका

var arrayBuffer = new Uint8Array(nodeBuffer).buffer;

हालाँकि, यह 1024 तत्वों के साथ बफर पर सुझाए गएArrayBuffer फ़ंक्शन की तुलना में लगभग 4 गुना धीमा प्रतीत होता है।


3
देर अलावा: @trevnorris कहते हैं , "[वी 8] में शुरू होने वाले 4.3 बफ़र Uint8Array द्वारा समर्थन कर रहे हैं" तो संभवतः यह अब तेजी से होता है ...
ChrisV

ऐसा करने के सुरक्षित तरीके के लिए मेरा जवाब देखें।
ZachB


1
यह केवल इसलिए काम करता है क्योंकि Node.js 4.x और उच्चतर के Bufferउदाहरण भी हैं Uint8Array। निचले Node.js संस्करणों के लिए आपको एक toArrayBufferफ़ंक्शन लागू करना होगा।
बेनी न्युगबॉएर

14

1. Bufferसिर्फ एक में देखने के लिए एक दृश्य हैArrayBuffer

Buffer, वास्तव में, एक है FastBuffer, जो extends(से विरासत में मिला) Uint8Array, जो कि वास्तविक स्मृति के एक ऑक्टेट-यूनिट व्यू ("आंशिक एक्सेसर") है, ए ArrayBuffer

  📜 नोड.जेएस 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;

2. एक 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जो वास्तव में आवश्यक मेमोरी को फिट करता है।
  📜 नोड.जेएस 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);
  }
}
  📜 नोड.जेएस 9.4.0/lib/buffer.js#L98-L100
function createUnsafeBuffer(size) {
  return new FastBuffer(createUnsafeArrayBuffer(size));
}

" मेमोरी पूल " से आपका क्या मतलब है ?

एक मेमोरी पूल एस के लिए छोटे आकार के मेमोरी चंक्स रखने के लिए एक निश्चित आकार का पूर्व-आवंटित मेमोरी ब्लॉक है Buffer। इसके उपयोग से छोटे आकार की मेमोरी चंक्स को एक साथ कस कर रखा जाता है, इसलिए छोटे आकार के मेमोरी चंक्स के अलग-अलग प्रबंधन (आवंटन और डील्लोकेशन) के कारण होने वाले विखंडन को रोकता है।

इस स्थिति में, मेमोरी पूल ArrayBufferएस हैं जिनका आकार डिफ़ॉल्ट रूप से 8 KiB है, जो इसमें निर्दिष्ट है 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.

3. तो हम यह " विचारों " स्मृति निकालने की जरूरत है ।

एक ArrayBufferआकार में तय किया गया है, इसलिए हमें भाग की एक प्रति बनाकर इसे बाहर निकालने की आवश्यकता है। ऐसा करने के लिए, हम का उपयोग Bufferकी byteOffsetसंपत्ति और lengthसंपत्ति है, जो से लिए गए हैं Uint8Array, और विधि है, जो एक का एक हिस्सा की एक प्रतिलिपि बनाता । यहाँ -ing विधि @ZachB से प्रेरित थी ।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. प्रदर्शन में सुधार

यदि आप परिणाम को केवल पढ़ने के लिए उपयोग कर रहे हैं, या इनपुट Buffers की सामग्री को संशोधित करना ठीक है , तो आप अनावश्यक मेमोरी कॉपी से बच सकते हैं।

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
यह सब ठीक है और अच्छा है ... लेकिन क्या आपने वास्तव में ओपी के सवाल का जवाब दिया है? यदि आपने किया, तो दफन हो गया ...
Tustin2121

बहुत बढ़िया जवाब! में obtain_arraybuffer: buf.buffer.subarrayलगता नहीं है। क्या आपका मतलब buf.buffer.sliceयहाँ था?
हर रोज़ उत्पादक

@everydayproductive धन्यवाद। जैसा कि आप संपादित इतिहास में देख सकते हैं, मैंने वास्तव में इसका उपयोग किया 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

एक ऐरे-बफ़र और एक स्ट्रिंग के बीच परिवर्तित करने पर रेनाटो मैंगिनी का एक अच्छा लेख है ।

मैंने एक कोड उदाहरण (Node.js के लिए) में आवश्यक भागों को संक्षेप में प्रस्तुत किया है। यह भी दिखाता है कि टाइप किए गए 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 एरे के लिए ऊपर की कोशिश की और यह सिर्फ काम नहीं किया।

मैंने यह महसूस किया कि वास्तव में सही चंक्स में दृश्य को देखने के लिए आवश्यक डेटा को पढ़ा जाना चाहिए। इसका मतलब स्रोत बफ़र से एक बार में 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++;
}

यही कारण है कि मार्टिन थॉमसन का जवाब Uint8Array का उपयोग करता है - यह तत्वों के आकार के लिए अज्ञेय है। Buffer.read*तरीकों सब भी धीमी गति से कर रहे हैं।
ZachB

एकाधिक टाइप किए गए व्यू व्यूअर एक ही मेमोरी का उपयोग करके एक ही ArrayBuffer को संदर्भित कर सकते हैं। बफ़र में प्रत्येक मान एक बाइट है, इसलिए आपको इसे 1 बाइट के तत्व आकार के साथ एक सरणी में रखना होगा। आप मार्टिन की विधि का उपयोग कर सकते हैं, फिर कंस्ट्रक्टर में एक ही सरणी बफ़र का उपयोग करके एक नया फ्लोट64 एरे बना सकते हैं।
ZachB

0

यह प्रॉक्सी किसी भी कॉपी के बिना, किसी भी टाइपराइड्रेट्स के रूप में बफर को उजागर करेगा। :

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

यह केवल ले पर काम करता है, लेकिन आसानी से बीई में पोर्ट किया जा सकता है। इसके अलावा, वास्तव में यह परीक्षण करने के लिए कभी नहीं मिला कि यह कितना कुशल है।


1
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं
koceeng

2
मेरा शब्दांकन बहुत आधिकारिक नहीं लग सकता है, लेकिन यह समाधान को फिर से बनाने के लिए पर्याप्त जानकारी प्रदान करता है। समाधान जावास्क्रिप्ट प्रॉक्सी पर निर्भर करता है कि एक देशी NodeJS बफर को गेटेड और सेवर्स के साथ टाइप करने के लिए टाइप करें। यह बफ़र इंस्टेंस को किसी भी लाइब्रेरी के अनुकूल बनाता है जिसके लिए टाइप एरियर इंटरफ़ेस की आवश्यकता होती है। यह उत्तर मूल पोस्टर के लिए उम्मीद कर रहा था, लेकिन इसे खारिज करने के लिए स्वतंत्र महसूस करें क्योंकि यह आपके शैक्षणिक / कॉर्पोरेट लिंगो में फिट नहीं है। देखें क्या मुझे चिंता है।
Dlabz

0

अब इसके लिए एक बहुत ही उपयोगी npm पैकेज है: buffer https://github.com/feross/buffer

यह एक एपीआई प्रदान करने की कोशिश करता है जो नोड के बफर एपीआई के समान 100% है और अनुमति देता है:

और कुछ और।


-1

NodeJS, एक बिंदु पर (मुझे लगता है कि यह v0.6.x था) को ArrayBuffer का समर्थन था। मैंने यहाँ बेस 64 एनकोडिंग और डिकोडिंग के लिए एक छोटी सी लाइब्रेरी बनाई , लेकिन v0.7 में अपडेट करने के बाद से, परीक्षण (NodeJS पर) विफल हो जाते हैं। मैं कुछ ऐसा बनाने की सोच रहा हूं जो इसे सामान्य करता है, लेकिन तब तक, मुझे लगता है कि नोड के मूल 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
}

मैं अपनी vhd डिस्क छवि की जांच करने के लिए इसका उपयोग करता हूं।


यह एक विशेष (और धीमी गति) क्रमबद्धता-आधारित विधि की तरह दिखता है, बफ़र / एरेबर्फर से / को परिवर्तित करने के लिए एक सामान्य विधि नहीं है?
ZachB

@ZachB यह V5.0.0 + [केवल] = = के लिए सामान्य विधि है।
मिगुएल वेलेंटाइन डे

toArrayBuffer(new Buffer([1,2,3]))-> ['01', '02', '03']- यह स्ट्रिंग्स की एक सरणी है, न कि पूर्णांक / बाइट्स।
ZachB

@ZachB रिटर्न ऐरे -> रिटर्न लिस्ट। मैं int-> स्ट्रिंग को स्टडआउट के लिए ठीक करता हूं
मिगुएल वेलेंटाइन

उस मामले में यह stackoverflow.com/a/19544002/1218408 के समान है , और फिर भी बिना आवश्यक बाइट ऑफसेट stackoverflow.com/a/31394257/1218408 में चेक करता है ।
ZachB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.