Estoy teniendo problemas para leer los datos binarios en node.js. Esto es lo que yo hago:

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

Observar cómo un 0xc2 byte se inserta en el índice 0x29 cuando la lectura con el nodo. ¿Por qué es eso? He dicho codificación binaria tanto a readFileSync y toString.
También he intentado ascii pero luego me sale una diferente e igual de mal resultado.

2 Comentarios

  1. 7

    La 'binary' la codificación es un alias para 'latin1', que claramente no quieren al leer los datos de carácter no.

    Si quieres los datos en bruto, no se especifica un tipo de codificación (o de suministro de null)*. Usted obtendrá una Buffer en lugar de una cadena, la que te desea utilizar directamente en lugar de utilizar toString en él.

    * (Algunas APIs [como fs.watch] también aceptar 'buffer', pero no en la lista de codificaciones y readFileSync no dice que lo hace. [Gracias Patrick para proporcionar la lista de link.])

  2. 5

    Sólo para añadir algo más de información, la razón por la que esto está sucediendo es porque está pasando una cadena de stdout.write(), que es implícitamente, se convierte en un Buffer antes de ser escrito, y cuando lo haga en el Node.js REPL con esta particular de la subcadena en la posición 0 x 28 de su archivo binario, se obtiene el comportamiento que se describe:

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

    Así como @T. J. Crowder correctamente sugerido, aquí está cómo arreglar tu script:

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

    Esto también utiliza Buffer#slice() en lugar de String#substring().

Dejar respuesta

Please enter your comment!
Please enter your name here