[英]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字节。 这是为什么? 我已经说过readFileSync
和toString
二进制编码。 我也试过ascii,但后来我得到了一个不同的,同样错误的结果。
只是为了添加更多信息,发生这种情况的原因是因为你将一个字符串传递给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.