【问题标题】:How to write and read bits one by one in a file via NodeJS?如何通过NodeJS在文件中逐位写入和读取?
【发布时间】:2015-02-01 11:58:23
【问题描述】:

我想使用01 位值创建一个二进制文件,然后我想一个一个地读取它们。

我该怎么做?

我尝试过写作:

var out = require("fs").createWriteStream("./out");
out.write(new Buffer("0"));   // this writes "0" as string
out.write(new Buffer(["0"])); // this creates something strange,
                              // but I'm not sure it's the needed thing

文件存在后,我想迭代该文件中的所有位:

require("fs").readFile("./out", function (err, buff) {
   // how to access here `0` and `1` values?
});

这样做的正确方法是什么?

【问题讨论】:

  • 你能解释一下吗?你具体想做什么?如果流确实是您想要的,则可以创建转换流,但这尚不清楚。否则,您将不得不读取/写入字节值并使用位掩码来获取所需的值。
  • @Brad 从我在其他帖子上看到的按字节读取可以使用stream.on("byte", ...) 来实现,这就是我真正需要的。我正在为 ARC 机器编写一个汇编器和一个解释器应用程序。为此,我需要将字节(32 位)存储在二进制文件中,然后对其进行解释,但首先我需要正确编写它们,正确读取它们并最终处理它们。
  • 您想要字节还是 32 位整数?缓冲区类允许您从缓冲区读取/写入各种值。
  • @Brad 我的错,1 字节 === 8 位,我需要连续读写 32 位。

标签: node.js stream binary buffer machine-code


【解决方案1】:

缓冲区在字节级别运行。一旦你访问了一个特定的字节(例如buff[0]),它就是一个普通的javascript数字,所以你可以对该数字进行任何位操作(例如buff[0] & 0x0F)。

Buffer 对象上有convenience functions,它也允许您写入不同类型的数字。例如:buff.writeUInt32BE(5, 0) 将在 Buffer 中的位置 0 处以大端模式写入一个 32 位无符号整数 5。在位置 0 以大端模式读取 32 位无符号整数:buff.readUInt32BE(0)

【讨论】:

  • 因此具有以下字符串:“11000010000000000010100000010100”如何将其写入(然后读取)到(从)二进制格式的文件中?我应该做new Buffer(str.split("").map(function (c) { return parseInt(c); }))吗?
  • 这是一个 32 位整数,所以最简单的方法可能是:var buf = new Buffer(4); buf.writeUInt32BE(parseInt(str, 2), 0);。然后在任何地方使用buf。要将这个数字写入文件,您可以执行以下操作:fs.writeFileSync('foo.dat', buf);
  • 我认为这里缺少的部分是parseInt(stringOfOnesAndZeroes, 2)——您可以使用 base-2 parseInt 将“二进制字符串”转换为实际数字。
猜你喜欢
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2012-03-19
  • 2010-11-16
  • 2016-09-10
  • 2014-12-29
相关资源
最近更新 更多