Node.js node js,如何将整数写入/读取到二进制文件?

Node.js node js,如何将整数写入/读取到二进制文件?,node.js,binary,Node.js,Binary,我是新手,所以可能会问一个基本问题。 我有一系列的浮标 [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

我是新手,所以可能会问一个基本问题。 我有一系列的浮标

[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, ... ] 
到/从二进制文件

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

您需要使用一个(或标准Uint8Array,但由于这是node.js,我将使用Buffer)。通过阅读文档,你基本上可以知道你需要做什么,但我将描述你需要做什么才能让你领先

首先,你需要做几个决定

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

  • 您想在磁盘上以big-endian还是little-endian形式存储数字?FWIW,程序员倾向于选择小端,硬件设计师倾向于选择大端。这并不重要,但要始终如一。不要在一个文件中混合结尾

  • 既然你已经下定决心了,让我们举个例子。例如,假设您希望在一个文件中存储两个32位整数和一个双精度整数。您需要的空间是
    32+32+64=128位=16字节
    。因此,您需要一个16字节的缓冲区(是的,缓冲区在字节级别运行,您基本上被临时提升为C程序员):

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

    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 write函数将buffer
    b
    的值写入文件。请注意,您应该将编码设置为
    “binary”
    ,因为fs函数的默认编码是utf8,它可能试图解析数据并损坏数据


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

    更具体地说,这里是您希望实现的目标的答案

        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()
    

    应该注意的是,在上面的简单示例中,我们对3个数字进行了编码,它们以字符串形式占用15个字节(如果要在它们之间添加空格,则为17个字节),并将它们存储为16个字节的二进制值。二进制并不总是以更难调试为代价为您带来很多好处
        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()