将二进制 NodeJS Buffer 转换为 JavaScript ArrayBuffer
2022-08-30 01:28:31
如何将 NodeJS 二进制缓冲区转换为 JavaScript ArrayBuffer?
如何将 NodeJS 二进制缓冲区转换为 JavaScript ArrayBuffer?
缓冲区
的实例也是 node.js 4.x 及更高版本中 Uint8Array
的实例。因此,最有效的解决方案是按照 https://stackoverflow.com/a/31394257/1375574 直接访问该物业。Buffer 构造函数还采用 ArrayBufferView 参数(如果需要转到另一个方向)。buf.buffer
请注意,这不会创建副本,这意味着对任何 ArrayBufferView 的写入都将写入原始 Buffer 实例。
从缓冲区到数组缓冲区:
function toArrayBuffer(buf) {
const ab = new ArrayBuffer(buf.length);
const view = new Uint8Array(ab);
for (let i = 0; i < buf.length; ++i) {
view[i] = buf[i];
}
return ab;
}
从数组缓冲区到缓冲区:
function toBuffer(ab) {
const buf = Buffer.alloc(ab.byteLength);
const view = new Uint8Array(ab);
for (let i = 0; i < buf.length; ++i) {
buf[i] = view[i];
}
return buf;
}
Buffer
s 是 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);
和偏移量是必需的,因为小的 s(默认情况下小于 4 kB,池大小的一半)可以在共享上查看。如果不进行切片,则最终可能会得到来自另一个 .请参阅文档中的说明。slice
Buffer
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);
使用马丁·汤姆森的答案,它以O(n)时间运行。(另请参阅我对他关于非优化的答案的评论的回复。使用数据视图很慢。即使您需要翻转字节,也有更快的方法可以做到这一点。
您可以使用 https://www.npmjs.com/package/memcpy 向任一方向(缓冲区到数组缓冲区并返回)。它比这里发布的其他答案更快,并且是一个写得很好的库。节点 0.12 到 iojs 3.x 需要 ngossen 的分叉(请参阅此处)。