【问题标题】:Reading binary data in node.js在 node.js 中读取二进制数据
【发布时间】:2018-03-08 13:48:30
【问题描述】:

我在读取 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,但得到了不同且同样错误的结果。

【问题讨论】:

    标签: javascript node.js binary


    【解决方案1】:

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

    如果您想要原始数据,don't specify an encoding at all(或提供null)*。你会得到一个Buffer 而不是一个字符串,然后你想直接使用它而不是在上面使用toString

    *(一些 API [如 fs.watch] 也接受 'buffer',但它不在 the list of encodingsreadFileSync 上没有说它接受。[感谢 Patrick 提供列表链接。])

    【讨论】:

    • 是我自己,还是这么荒谬?
    • @NathanChappell - 从表面上看,它似乎很荒谬,但当您深入了解细节时会更有意义。从某种意义上说,latin1binary 的别名,而不是相反。上面链接的list of encodingsthis MDN page 中的详细信息。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 2010-12-08
      • 1970-01-01
      • 2012-08-06
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多