2016-03-29 3 views
0

NodeJsを使用して解析して変数として保存しようとしているバイナリファイルを使用しています。私は現在ファイルをバッファに持っています。要件文書に従ったファイルのこの部分はUTF-32です。nodejs UTF-32のバッファtoString関数

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) 

Node Documentation for Bufferによれば、文字列utf-32に変換するものはありません。

この変換を可能にするためにBUFFERを拡張できるNPNモジュールがありますか?この変換が行われるようにtoString()を拡張するbuffer.prototype.toString()関数を記述する必要がありますか?もしそうなら誰も彼らが使っているものをすでに持っていますか?


ここには、ファイルの最初の256/FFバイトのHEXダンプがあります。

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 

の@ヴラドの答え

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); 

を使用した後、私は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) 

誰かがdata.slice(96, 179)が4の倍数ではなかったので、それがあったが、私ができることが示唆されました最初のバイトと179が4バイトのグループの最後のバイト(176,177,178,179)であれば96年以降のことを理解しています。 180は、終わりではなく次のバイトの開始点になります。

ご協力いただければ幸いです。


最後に私が間違っていたことを理解しました。 @Vladは大部分が正しかった。私は//TRANSLIT//IGNOREを持っていなかったし、buffer.sliceはHalf-Closed Interval [96,180]であると思われ、inclusive [96,179]ではないと思われたので、終了インデックス1もシフトしなければならなかった。

私が本当に必要なことはした

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); 

答えて

0

はい、多くの場合、バッファの復号に使用iconv npm moduleがあります。

そのREADMEによると、あなたが試すことができます:

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); 

はそれがあなたのために働くなら、私に教えてください。

+0

iconvをnpmでインストールしようとすると、Pythonが見つからないことがわかります。 > node-gyp rebuild C:¥nodeCode¥node_modules¥iconv>定義されていない場合npm_config_node_gyp(ノード "C:¥Program Files¥nodejs¥node_modules¥npm¥bin¥node-gyp-bin¥¥..¥.. \ node_modules \ node-gyp \ bin \ node-gyp.js "rebuild)else(ノード再構築) gyp ERR!エラーを構成してください gyp ERR!スタックエラー:Python実行ファイル "python"が見つかりません。PYTHON env変数を設定できます。 私はコンパイラを持たなくてもできることを見つけようとしていました。 – shaun

+0

@shaun http://stackoverflow.com/a/21366601/2727317 私はあなたがWindowsを使用していると思います。 –

+0

C++を含むようにVS 2015のコピーを変更した後。私は最終的に完了するためにiconvをインストールしました。しかし、私が使用したとき 'Iconv = require( 'iconv')。Iconv; var convertUTF32 =新しいIconv( 'UTF-32LE'、 'UTF-8'); var string_UserName = convertUTF32.convert(data.slice(96、179)); console.log( 'User Name:' + string_UserName); ' 私が得るのはエラーです。 'エラー:文字列が不完全です。 ' ' var string_UserName = convertUTF32.convert(data.slice(96、179))。toString( 'utf8');'に変更すると同じエラーが発生します。 – shaun

関連する問題