2017-09-27 8 views
2

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を試しましたが、違った結果を得ました。

答えて

5

のエンコーディングは、'latin1'のエイリアスです。これは、文字以外のデータを読み取るときには必要ありません。

生データを使用する場合は、don't specify an encoding at all(またはnull)*を使用します。文字列の代わりにBufferが得られます。文字列の代わりにtoStringを使用するのではなく、直接使用したいと考えています。

*(一部のAPIも'buffer'を受け入れるが、それはthe list of encodingsではないとreadFileSyncが。[リストのリンクを提供してくれてありがとうPatrick。]それがないと言っていません[fs.watchのように])いくつかのより多くの

1

ちょうど追加しますこの理由は、文字列をstdout.write()に渡しているためです。書き込まれる前に暗黙的にBufferに変換されています。また、この特定の部分文字列をNode.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()を使用しています。

関連する問題