2016-03-29 4 views
0

Ich arbeite mit einer binären Datei, die ich analysieren und als Variablen mit NodeJs speichern möchte. Ich habe die Datei derzeit in einem Puffer. Dieser Teil der Datei gemäß dem Anforderungsdokument ist UTF-32.nodejs Buffer toString Funktion für UTF-32

41 00 00 00 55 00 00 00 54 00 00 00 4F 00 00 00 
31 00 00 00 45 00 00 00 30 00 00 00 33 00 00 00 
38 00 00 00 31 00 00 00 31 00 00 00 36 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 

var string_UserName = data.toString('utf-8', 96, 179); 
console.log('User Name: ' + string_UserName); 
//User Name: A U T O 1 E 0 3 8 1 1 6 

var string_UserName = data.toString('utf-16le', 96, 179); 
console.log('User Name: ' + string_UserName); 
//User Name: A U T O 1 E 0 3 8 1 1 6 

var string_UserName = data.toString('utf-32le', 96, 179); 
console.log('User Name: ' + string_UserName); 
//buffer.js:387 
     throw new TypeError('Unknown encoding: ' + encoding); 
    ^
TypeError: Unknown encoding: utf-32le 
    at Buffer.slowToString (buffer.js:387:17) 
    at Buffer.toString (buffer.js:399:31) 

Nach dem Node Documentation for Buffer ist es nicht etwas, gebaut in bespannen utf-32 zu konvertieren.

Gibt es ein NPM-Modul, das BUFFER erweitern kann, um diese Konvertierung zu ermöglichen, oder muss ich eine buffer.prototype.toString() -Funktion schreiben, um toString() zu erweitern, damit diese Konvertierung stattfinden kann? Wenn ja, hat jemand schon einen, den er benutzt?


Hier ist ein HEX-Dump der ersten 256/FF-Bytes der Datei.

AF 03 00 00 D0 00 00 00 16 81 03 1E 0A 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
41 00 00 00 55 00 00 00 54 00 00 00 4F 00 00 00 
31 00 00 00 45 00 00 00 30 00 00 00 33 00 00 00 
38 00 00 00 31 00 00 00 31 00 00 00 36 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 32 30 31 36 30 31 32 32 31 32 33 35 
34 32 30 30 30 30 30 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

Nach der Verwendung Antwort des @ vlad

Iconv = require('iconv').Iconv; 
var convertUTF32 = new Iconv('UTF-32', 'UTF-8'); 
var string_UserName = convertUTF32.convert(data.slice(96, 179)); 
console.log('User Name: ' + string_UserName); 

Ich erhalte einen Fehler von ICONV:

C:\nodeCode\node_modules\iconv\lib\iconv.js:145 
      throw errnoException('EINVAL', 'Incomplete character sequence.'); 
     ^

Error: Incomplete character sequence. 
    at errnoException (C:\nodeCode\node_modules\iconv\lib\iconv.js:169:13) 
    at Object.convert (C:\nodeCode\node_modules\iconv\lib\iconv.js:145:17) 
    at Iconv.convert (C:\nodeCode\node_modules\iconv\lib\iconv.js:59:12) 
    at C:\nodeCode\metaProc.js:49:37 
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:404:3) 
    at fs.js:312:11 
    at nextTickCallbackWith0Args (node.js:456:9) 
    at process._tickCallback (node.js:385:13) 

Jemand schlug vor, dass es war, weil data.slice(96, 179) nicht ein Vielfaches von 4 war, aber ich kann verstehe, dass seit 96 das erste Byte und 179 das letzte Byte einer 4 Byte-Gruppe ist (176, 177, 178, 179). 180 wäre der Anfang des nächsten Bytes, nicht das Ende.

Jede Hilfe wäre willkommen.


Endlich herausgefunden, was ich falsch gemacht habe. Während @Vlad meistens recht hatte. Ich hatte nicht die //TRANSLIT//IGNORE drin und musste auch den Ende Index 1 verschieben, da buffer.slice Half-Closed Interval [96, 180] und nicht inclusive [96, 179] scheint, wie ich dachte.

Was ich wirklich brauchte, war:

Iconv = require('iconv').Iconv; 
var iconv32 = new Iconv('UTF-32LE', 'UTF-8//TRANSLIT//IGNORE'); 
var string4_UserName = iconv32.convert(data.slice(96,180)).toString('utf-8'); 
console.log('User Name: ' + string4_UserName); 

Antwort

0

Ja, es ein iconv npm module oft für Puffer-Decodierung verwendet wird.

Nach der seine README, können Sie versuchen:

var Iconv = require('iconv').Iconv; 
var iconv = new Iconv('UTF-32LE', 'UTF-8'); 
var string_UserName = iconv.convert(data.slice(96, 179)).toString('utf8'); 
console.log('User Name: ' + string_UserName); 

Lassen Sie mich wissen, ob es für Sie arbeitet.

+0

Wenn ich versuche, iconv npm zu installieren, sagt es mir, dass ich Python nicht finden kann. > node-gyp rebuild C: \ nodeCode \ node_modules \ iconv> falls nicht definiert npm_config_node_gyp (node ​​"C: \ Programme \ nodejs \ node_modules \ npm \ bin \ node-gyp-bin \\ .. \ .. \ node-module \ node-gyp \ bin \ node-gyp.js "Neuerstellung" else (node ​​rebuild) gyp ERR! Fehler konfigurieren gyp ERR! Stapelfehler: Python-Programmdatei "Python" kann nicht gefunden werden, Sie können die PYTHON-env-Variable festlegen. Ich habe versucht, etwas zu finden, das getan werden könnte, ohne einen Compiler einbinden zu müssen. – shaun

+0

@shaun werfen Sie einen Blick auf http://Stackoverflow.com/a/21366601/2727317 Ich denke, Sie verwenden Windows –

+0

Nach der Änderung meiner Kopie von VS 2015, um C++ einzuschließen. Ich habe schließlich npm installieren iconv abgeschlossen. Aber wenn ich 'Iconv = require ('iconv') verwenden.Iconv; var convertUTF32 = neues Iconv ('UTF-32LE', 'UTF-8'); var string_UserName = convertUTF32.convert (data.slice (96, 179)); console.log ('Benutzername:' + string_UserName); ' Alles, was ich bekomme, ist ein Fehler. 'Fehler: Unvollständige Zeichenfolge. ' Gleicher Fehler, wenn ich es in' var string_UserName = convertUTF32.convert (data.slice (96, 179)) ändern. ToString (' utf8 '); ' – shaun