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

时间:2017-02-23 09:13:25

标签: 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('fs');
  var wstream = fs.createWriteStream('myBinaryFile');
  var buffer = crypto.randomBytes(100);
  wstream.write(buffer);
  wstream.end();

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

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

例如,我如何写/读数组

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

来自/来自二进制文件。

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

2 个答案:

答案 0 :(得分:3)

你需要使用Buffer(或标准的Uint8Array,但由于这是node.js,我将使用Buffer)。你可以通过阅读文档找出你需要做的事情,但我会描述你需要做些什么才能让你有个先机。

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

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

  2. 您是否希望将该数字存储为大端或小端? FWIW,程序员倾向于喜欢小端,而硬件设计师往往更喜欢大端。真的不重要,但保持一致。不要将字节顺序混合在一个文件中。

  3. 现在你已经下定决心了,让我们举个例子吧。比如说你想在文件中存储两个32位整数和一个双精度数。您需要的空间是32 + 32 + 64 = 128 bits = 16 bytes。所以你需要一个16字节的缓冲区(是的,缓冲区在字节级运行,你基本上暂时升级为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"(或者是“缓冲区”?)。

答案 1 :(得分:1)

在这里更具体一点是您要完成的任务的答案。

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