2016-03-29 142 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的东西。

是否有一个NPM模块可以扩展BUFFER以允许此转换,或者是否需要编写一个buffer.prototype.toString()函数来扩展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的倍数,但我可以不明白,自96以来,如果第一个字节和179是4字节组(176,177,178,179)的最后一个字节。 180将是下一个字节的开始而不是结束。

任何帮助,将不胜感激。


终于搞清楚我做错了什么。 @Vlad大部分都是对的。我没有//TRANSLIT//IGNORE那里,并且不得不改变结束索引1,因为buffer.slice看起来像Half-Closed Interval [96,180)而不是inclusive [96,179]就像我想的那样。

我真正需要的是什么:

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

按照其自述,你可以尝试:

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

当我尝试npm install iconv时,它告诉我我找不到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(node rebuild) gyp ERR!配置错误 gyp ERR!堆栈错误:找不到Python可执行文件“python”,你可以设置PYTHON env变量。 我试图找到一些可以做到的事情,而无需引入编译器。 – shaun

+0

@shaun看看http://stackoverflow.com/a/21366601/2727317 我想你正在使用Windows –

+0

在修改我的VS 2015副本以包含C++之后。我终于得到了npm install iconv来完成。但是,当我使用 'Iconv = require('iconv')。语言Iconv; var convertUTF32 = new Iconv('UTF-32LE','UTF-8'); var string_UserName = convertUTF32.convert(data.slice(96,179)); console.log('用户名:'+ string_UserName);' 我得到的只是一个错误。 '错误:不完整的字符序列.' 当我将其更改为'var string_UserName = convertUTF32.convert(data.slice(96,179))。toString('utf8'); – shaun