如何将utf-16缓冲区与字符串进行比较?

时间:2015-12-08 23:46:13

标签: javascript node.js utf-16

我有一个看起来像这样的缓冲区:

<Buffer 50 00 6f 00 77 00 65 00 72 00 50 00 6f 00 69 00 6e 00 74 00 20 00 44 00 6f 00 63 00 75 00 6d 00 65 00 6e 00 74 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...>

当使用utf-16le读取此缓冲区或使用.toString()打印此缓冲区时,这是“PowerPoint文档”

但是,如果我这样做:

var stream = fs.createReadStream('test.ppt',{start:1152,end:1215,encoding:'utf16le'})
    stream
    .on('data',function(chunk){
        console.log(chunk.toString().trim());
        console.log(chunk.toString().trim().length);
        if(chunk.toString().trim() === "PowerPoint Document"){
            console.log('yay');
        }else{
            console.log('boo');
        }

打印:

PowerPoint Document  
32
boo

我如何比较这些?

1 个答案:

答案 0 :(得分:1)

您的字符串以空值结尾。由于字节1152-1215看起来像

0480h: 50 00 6F 00 77 00 65 00 72 00 50 00 6F 00 69 00  P.o.w.e.r.P.o.i. 
0490h: 6E 00 74 00 20 00 44 00 6F 00 63 00 75 00 6D 00  n.t. .D.o.c.u.m. 
04A0h: 65 00 6E 00 74 00 00 00 00 00 00 00 00 00 00 00  e.n.t........... 
04B0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 

最后的所有空字节都将转换为\u0000,因此您实际上正在比较:

'PowerPoint Document\u0000\u0000...' === 'PowerPoint Document'

......这显然是假的。

以字节1189结束。

顺便说一句:不保证使用您请求的所有数据触发流data事件。它可能仅使用部分数据触发多次(这就是为什么它被称为chunk)。您必须缓冲所有data个事件,直到收到end个事件,然后进行比较。