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,它在节点中接受Buffers,所以“正确”的方式是:

var arrByte = Uint8Array.from(data)

...但是,这根本不是必需的,因为 BufferUint8Arraynew 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从缓冲区数据转换为字节数组的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为标准数据类型

将 ctype 字节数组转换为字节

如何读取缓冲区的前 n 个字节并在 NodeJS 中转换为字符串?

在C中将无符号短数组转换为字节数组

NodeJS读取缓冲区二进制文件以浮动

ByteBuffer 和字节数组