为什么不能用ascii模式在node.js文件中写一个空字节?

这是我的代码

var fs = require('fs'); var fp = fs.openSync('binary.txt', "w"); var byte = '\0'; fs.writeSync(fp, byte, null, 'ascii'); 

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

现在,当我使用

 fs.writeSync(fp, byte, null, 'utf-8'); 

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

这不是因为文件具体,而是方式节点转换成字节写入ASCII。 你会看到在这个相同的行为:

 new Buffer('\0', 'ascii')[0] // 32 

如果你想写一个NULL字节的文件,不要使用一个string,只需要写你想要的字节。

 fs.writeSync(fp, new Buffer([0x00])); 

一般在做文件IO时,我build议只在内容是明文内容时才使用string。 如果你在做什么以外的事情,坚持使用Buffer

细节

它实际上是V8,而不是执行这种转换的节点。 节点将ascii编码公开为转换为二进制的更快方法。 为了达到这个目的,它使用V8的String::WriteOneByte方法,除非有明确的指示,否则这个函数自动将'\0'转换为' '