【问题标题】:nodejs conversion from buffer data to byte arraynodejs从缓冲区数据转换为字节数组
【发布时间】: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 输出为空白,未记录任何内容

标签: arrays node.js byte typed-arrays


【解决方案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 实例,但需要注意以下几点:

  1. Buffer 对象的内存被复制到TypedArray,而不是共享。

  2. 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 嗨,你能在这里分享代码吗,因为我在将缓冲区数据转换为字节数组时也遇到了同样的问题。
猜你喜欢
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多