【发布时间】:2016-03-31 06:22:58
【问题描述】:
我正在处理一个二进制文件,我试图使用 NodeJs 解析并存储为变量。我的文件当前在缓冲区中。这部分文件根据需求文档是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)
根据Node Documentation for Buffer,没有内置东西可以转换为字符串utf-32。
是否有一个 NPM 模块可以扩展 BUFFER 以允许这种转换,或者我是否需要编写一个 buffer.prototype.toString() 函数来扩展 toString(),这将允许这种转换发生?如果是这样,是否有人已经拥有了他们使用的一个?
这是文件前 256/FF 字节的十六进制转储。
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
使用@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);
我收到来自 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);
【问题讨论】:
标签: javascript node.js