Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
142
rated 0 times [  146] [ 4]  / answers: 1 / hits: 66451  / 7 Years ago, wed, september 27, 2017, 12:00:00

I am writing a JavaScript program that I am executing in the Node.js runtime environment.


I want to read binary data from a file into a buffer, but I keep running into issues.


Here is what I have done so far:

    $ 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 .

Notice how a 0xc2 byte is inserted at index 0x29 when reading with node. Why is that? I've stated binary encoding both to readFileSync and toString.
I've also tried ascii but then I get a different and equally wrong result.


More From » node.js

 Answers
40

The 'binary' encoding is an alias for 'latin1', which you clearly don't want when reading non-character data.



If you want the raw data, don't specify an encoding at all (or supply null)*. You'll get a Buffer instead of a string, which you'd then want to use directly rather than using toString on it.



* (Some APIs [like fs.watch] also accept 'buffer', but it's not on the list of encodings and readFileSync doesn't say it does. [Thanks Patrick for providing the list link.])


[#56375] Sunday, September 24, 2017, 7 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
coleman

Total Points: 518
Total Questions: 81
Total Answers: 96

Location: Aland Islands
Member since Wed, Nov 17, 2021
3 Years ago
;