nodejs从缓冲区数据转换为字节数组
Posted
技术标签:
【中文标题】nodejs从缓冲区数据转换为字节数组【英文标题】:nodejs conversion from buffer data to byte array 【发布时间】:2019-01-01 19:47:54 【问题描述】:我想将缓冲区数据转换为字节数组。这是我尝试过的方法
import * as fs from 'fs';
[...]
event:(data) =>
fs.readFile(data, function(err, data)
var arrByte= new Uint8Array(data)
var binaryData= new Blob([arrByte])
console.log(binaryData)
我还没有完成这项工作,因此我的帖子。我非常想知道我在做什么这是不对的。
【问题讨论】:
这段代码有什么问题? @Cerberus 输出为空白,未记录任何内容 【参考方案1】: import * as fs from 'fs';
[...]
event:(data) =>
fs.readFile(data, function(err, data)
var arrByte= new Uint8Array.from(Buffer.from(data))
var binaryData= new Blob([arrByte])
if (err) throw err;
console.log(binaryData)
【讨论】:
“数据”变量的类型是什么? @VikasSatpute 在外部上下文中(即作为 fs.readFile 的第一个参数)是文件名;在内部上下文中,它是从文件中读取的数据。在我的测试中,内部数据已经是 Buffer 类型,所以你根本不需要调用 Buffer.from(data)。【参考方案2】:Buffer
docs are very enlightening:
在引入
TypedArray
之前,javascript 语言没有读取或操作二进制数据流的机制。Buffer
类是作为 Node.js API 的一部分引入的,用于与 TCP 流、文件系统操作和其他上下文中的八位字节流进行交互。
TypedArray
现已可用,Buffer
类以更优化且更适合 Node.js 的方式实现Uint8Array
API。…
缓冲区实例也是
Uint8Array
实例。 但是,与TypedArray
存在细微的不兼容。例如,ArrayBuffer#slice()
创建切片的副本时,Buffer#slice()
的实现会在现有Buffer
上创建一个视图而不进行复制,从而使Buffer#slice()
效率更高。也可以从 Buffer 中创建新的 TypedArray 实例,但需要注意以下几点:
Buffer
对象的内存被复制到TypedArray
,而不是共享。
Buffer
对象的内存被解释为不同元素的数组,而不是目标类型的字节数组。也就是说,new Uint32Array(Buffer.from([1, 2, 3, 4]))
创建了一个带有元素[1, 2, 3, 4]
的 4 元素Uint32Array
,而不是带有单个元素[0x1020304]
或[0x4030201]
的Uint32Array
。
他们继续提到TypedArray.from
,它在节点中接受Buffer
s,所以“正确”的方式是:
var arrByte = Uint8Array.from(data)
...但是,这根本不是必需的,因为 Buffer
是 Uint8Array
和 new UintArray(someBuffer)
确实可以正常工作。
您的问题中也没有上下文,但节点中不存在 Blob
,无论如何您都不应该需要它,因为 Buffer
已经为您提供了对二进制数据和其他 fs
方法的原始访问权限让你读写文件。
【讨论】:
感谢您的帖子。但是,记录 arrByte 会给出此输出Uint8Array [ ]
你的缓冲区是多少 (data
)? err
是什么?我敢打赌,您会遇到错误并忽略它。永远不要跳过错误检查——总是在节点回调中检查err
。
这是来自指纹渲染器进程 <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 01 f4 01 f4 00 00 ff db 00 43 00 08 ...>
的缓冲区数据,我想将其转换为 byte[] 并且我还检查了 if (err) throw err
... 猜猜没有错误
当我将 arrByte 设置为 Uint8Array.from(Buffer.from(data))
时,我能够得到 Uint8Array(55797) [255, 216, 255, 224, 0, 16, 74, 70, 73, 70, 0, 1, 1, 1, 1, 244, ...]
非常感谢
@lilKing 嗨,你能在这里分享代码吗,因为我在将缓冲区数据转换为字节数组时也遇到了同样的问题。以上是关于nodejs从缓冲区数据转换为字节数组的主要内容,如果未能解决你的问题,请参考以下文章