【问题标题】:node js, how to write/read integers to binary file?node js,如何将整数写入/读取二进制文件?
【发布时间】:2020-06-02 14:21:26
【问题描述】:

我是新手,所以可能会问一个基本问题。 我有一个浮点数组

[1.3, 2.0, 10, 9.8, ... ] . //let's say length = 10

我想将其存储在二进制文件中。 我想写成下面的格式

 10 1.3 2.0 10 9.8, ...  

所以当我稍后加载该文件时,我首先读取长度 10,然后读取浮点数 10 次。

我认为这样可以节省空间,并且应该比仅将其作为文本写入/读取更快。

到目前为止,我在 node.js 中找到了一些关于二进制文件的信息。

  var fs = require('fs');
  var wstream = fs.createWriteStream('myBinaryFile');
  var buffer = crypto.randomBytes(100);
  wstream.write(buffer);
  wstream.end();

我不知道如何将我的数字写入缓冲区并将缓冲区写入文件。

另外,我读过一些文档说节点中的缓冲区只有整数 0~255,这是否意味着它不能处理大于 255 的整数?

例如,如何写入/读取数组

  [11000, 24535, 92833, 45353, ... ] 

到/从二进制文件。

我想我需要一些指导,所以我在这里寻求帮助。 请指出我应该怎么做,谢谢!

【问题讨论】:

    标签: node.js binary


    【解决方案1】:

    您需要使用Buffer(或标准的 Uint8Array,但由于这是 node.js,我将使用 Buffer)。您基本上可以通过阅读文档来弄清楚您需要做什么,但我将描述您需要做些什么来让您领先一步。

    首先,您需要做出几个决定。

    1. 您希望整数是 8 位还是 16 位、32 位还是 48 位? (是的,节点支持 48 位整数但不支持 64 - 可能是因为 js 中的数字是 52 位尾数的双精度数,因此 64 位整数无法准确转换为数字)。另外,如果你想要浮点数,你想要浮点数(32 位)还是双精度数(64 位)?

    2. 您想将磁盘上的数字存储为大端还是小端? FWIW,程序员往往更喜欢小端,而硬件设计师往往更喜欢大端。没关系,但保持一致。不要在单个文件中混合字节顺序。

    既然您已经下定决心,让我们举个例子。例如,您想在一个文件中存储两个 32 位整数和一个双精度整数。您需要的空间是32 + 32 + 64 = 128 bits = 16 bytes。所以你需要一个 16 字节的 Buffer(是的,buffers 是在字节级别操作的,你基本上是临时晋升为 C 程序员的):

    var b = Buffer.alloc(16);
    

    现在让我们存储这些数字。假设您决定将它们存储为小端:

    var x = 12345;
    var y = 54321;
    var z = 1.234;
    
    b.writeInt32LE(x,0);  // write x to bytes 0-3
    b.writeInt32LE(y,4);  // write y to bytes 4-7
    b.writeDoubleLE(z,8); // write z to end of buffer
    

    现在您可以使用任何 fs 写入函数将缓冲区 b 的值写入文件。请注意,您应该将编码设置为"binary",因为 fs 函数的默认编码是 utf8,它可能会尝试解析您的数据并破坏它。

    要从文件中读取值,您可以反向执行相同的操作。使用buffer.read... 函数。同样,在从磁盘读取文件时,请务必将编码设置为"binary"(或者是“缓冲区”?)。

    【讨论】:

    • 需要注意的是,在上面的简单示例中,我们以字符串形式编码了 3 个占 15 个字节的数字(如果要在它们之间添加空格,则为 17 个字节)并将它们存储为 16 个字节二进制值。二进制文件并不总是以更难调试为代价为您带来很多好处
    【解决方案2】:

    在这里更具体一点是对您想要完成的目标的回答。

        const values = [0, 4764, 9243, 13167, 16303, 18461, 19513];
    
        var wstream = fs.createWriteStream(testDatFile, { encoding: 'binary' });
        wstream.on('finish', function() {
          console.log('file has been written');
        });
    
        console.log('buffer.from', Buffer.from(Int16Array.from(values).buffer));
        wstream.write(Buffer.from(Int16Array.from(values).buffer));
        wstream.end()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多