繁体   English   中英

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

[英]Reading binary data in 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处插入0xc2字节。 这是为什么? 我已经说过readFileSynctoString二进制编码。 我也试过ascii,但后来我得到了一个不同的,同样错误的结果。

'binary'编码是'latin1'的别名,在阅读非字符数据时您显然不需要。

如果您想要原始数据, 请不要指定编码 (或提供null )*。 您将获得一个Buffer而不是一个字符串,然后您需要直接使用它而不是使用toString

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

只是为了添加更多信息,发生这种情况的原因是因为你将一个字符串传递给stdout.write() ,它在写入之前被隐式转换回Buffer ,当你在Node.js REPL中这样做时使用二进制文件的位置0x28处的此特定子字符串,您将获得所描述的行为:

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

正如@TJCrowder正确建议的那样,以下是修复脚本的方法:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM