读取node.js中的二进制数据

在读取node.js中的二进制数据时遇到问题 这就是我所做的:

$ cat test.js var fs = require('fs'), binary = fs.readFileSync('./binary', 'binary').toString('binary'); process.stdout.write(binary.substring(0, 48)); $ xxd binary 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 00000010: 0300 3e00 0100 0000 0008 0000 0000 0000 ..>............. 00000020: 4000 0000 0000 0000 10a0 0000 0000 0000 @............... $ node test.js | xxd 00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............ 00000010: 0300 3e00 0100 0000 0008 0000 0000 0000 ..>............. 00000020: 4000 0000 0000 0000 10c2 a000 0000 0000 @............... 00000030: 00 . $ 

注意如何在读取节点时在索引0x29处插入一个0x​​c2字节。 这是为什么? 我已经说过二进制编码都readFileSynctoString 。 我也尝试过ASCII,但后来我得到了一个不同的,同样错误的结果。

'binary'编码是'latin1'的别名,在读取非字符数据时,您显然不希望这样做。

如果您需要原始数据, 请不要指定编码 (或提供null )*。 你会得到一个Buffer而不是一个string,然后你想直接使用,而不是使用toString就可以了。

*(某些API(如fs.watch )也接受'buffer' ,但它不在编码列表中 , readFileSync也没有这样说[感谢Patrick提供列表链接])

只是添加更多的信息,这是因为你正在传递一个stringstdout.write() ,这是隐式转换回Buffer之前被写入,当你这样做的Node.js REPL在你的二进制文件的位置为0x28的这个特定的子string,你得到你描述的行为:

 > new Buffer('\u0010\u00a0') <Buffer 10 c2 a0> 

正如@TJCrowder正确的build议,下面是如何修复你的脚本:

 var fs = require('fs'), binary = fs.readFileSync('./binary'); process.stdout.write(binary.slice(0, 48)); 

这也使用Buffer#slice()而不是String#substring()