为什么不能使用带有node.js的ascii模式在文件中写入空字节?

Jan*_*itz 5 javascript node.js

这是我的代码

var fs = require('fs');
var fp = fs.openSync('binary.txt', "w");

var byte = '\0';
fs.writeSync(fp, byte, null, 'ascii');
Run Code Online (Sandbox Code Playgroud)

在我打开binary.txt文件执行它之后,它包含0x20而不是预期的空字节.

现在我用的时候

fs.writeSync(fp, byte, null, 'utf-8');
Run Code Online (Sandbox Code Playgroud)

我在文件中得到了想要的空字节.

log*_*yth 6

这不是因为文件具体,而是因为Node将ASCII转换为字节进行写入.你会在这里看到相同的行为:

new Buffer('\0', 'ascii')[0]
// 32
Run Code Online (Sandbox Code Playgroud)

如果要将NULL字节写入文件,请不要使用字符串,只需写入所需的字节即可.

fs.writeSync(fp, new Buffer([0x00]));
Run Code Online (Sandbox Code Playgroud)

通常在执行文件IO时,我建议仅在内容明确为文本内容时才使用字符串.如果你正在做任何事情,坚持使用Buffers.

细节

它实际上是V8,而不是执行此转换的Node.Node将ascii编码公开为更快的转换为二进制的方法.为实现这一点,它使用V8的String::WriteOneByte方法,除非明确指示不这样做,否则此函数会自动转换'\0'' '.

  • @jamesemanon在这种情况下不能肯定地说,但许多文件格式是二进制而不是100%文本.例如,您可以使用包含位/字节的标头部分作为存储元数据的标志,并使用几个字节指定文件中文本的起始点. (6认同)