【问题标题】:nodejs Buffer toString function for UTF-32UTF-32的nodejs缓冲区toString函数
【发布时间】: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


    【解决方案1】:

    是的,有一个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);
    

    让我知道它是否适合你。

    【讨论】:

    • 当我尝试 npm install iconv 时,它告诉我找不到 Python。 > node-gyp 重建 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" 重建)否则(节点重建)gyp ERR!配置错误gyp ERR!堆栈错误:找不到 Python 可执行文件“python”,您可以设置 PYTHON 环境变量。我试图找到一些无需引入编译器就可以完成的事情。
    • @shaun 看看stackoverflow.com/a/21366601/2727317 我猜你用的是Windows
    • 在修改我的 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('User Name: ' + string_UserName); 时,我得到的只是一个错误。 Error: Incomplete character sequence. 当我将其更改为 var string_UserName = convertUTF32.convert(data.slice(96, 179)).toString('utf8'); 时出现同样的错误
    猜你喜欢
    • 2018-04-15
    • 2011-08-02
    • 2016-07-04
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多