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)。通过阅读文档,你基本上可以知道你需要做什么,但我将描述你需要做什么才能让你领先
首先,你需要做几个决定
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函数将bufferb
的值写入文件。请注意,您应该将编码设置为“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()