[英]node js, how to write/read integers to binary file?
我是新手,所以可能会问一个基本问题。 我有一组浮点数
[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, ... ]
到/从二进制文件。
我想我需要一些指导,所以我在这里寻求帮助。 请指出我应该怎么做,谢谢!
您需要使用Buffer (或标准的 Uint8Array,但由于这是 node.js,我将使用 Buffer)。 您基本上可以通过阅读文档来弄清楚您需要做什么,但我将描述您需要做什么才能让您有一个良好的开端。
首先,您需要做出几个决定。
你想要你的整数是 8 位还是 16 位还是 32 位或 48 位? (是的,节点支持 48 位整数但不支持 64 - 可能是因为 js 中的数字是带有 52 位尾数的双精度数,因此 64 位整数无法准确转换为数字)。 另外,如果您想要浮点数,您想要浮点数(32 位)还是双精度数(64 位)?
您想将数字作为大端还是小端存储在磁盘上? FWIW,程序员倾向于喜欢小端,硬件设计师倾向于喜欢大端。 没关系,但要保持一致。 不要在单个文件中混合字节序。
既然你已经下定决心,让我们举个例子。 比如说你想在一个文件中存储两个 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"
(或者是“缓冲区”?)。
更具体地说,这里是您要完成的任务的答案。
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.