使用Buffer.compare / Buffer.from体验怪异的行为

时间:2018-10-07 19:49:33

标签: node.js buffer

我正在尝试修改缓冲区,但是在修改缓冲区时,我希望它们位于utf-8中,因此我尝试通过myBuffer.toString('utf8')执行此操作,但是如果我不做任何更改,并尝试通过{ {1}},有时会给我一个全新的缓冲。

这些情况似乎是在解析图像文件而不是html文件时。

我的下一步是通过使用以下代码比较两个缓冲区来接受错误或错误行为:

Buffer.from(myBuffer, 'utf8')

以下代码段却无法正常工作,并且可编辑始终为//myBuffer is the buffer is wish to attempt to modify let testParse = Buffer.from(myBuffer.toString('utf8'), 'utf8'); let editable = Buffer.compare(myBuffer, testParse); console.log(myBuffer); console.log(testParse); console.log(editable); ,这是示例输出:

-1

如您所见,缓冲区完全不同,但是返回<Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 10 00 00 00 5c 08 02 00 00 00 29 85 7d e1 00 00 15 31 49 44 41 54 78 01 ed 5d 05 94 db c8 b2 ... > <Buffer ef bf bd 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 10 00 00 00 5c 08 02 00 00 00 29 ef bf bd 7d ef bf bd 00 00 15 31 49 44 41 54 78 01 ef ... > -1

另一个缓冲区相等的示例:

-1

如您所见,两个缓冲区相等,并且<Buffer 3c 21 64 6f 63 74 79 70 65 20 68 74 6d 6c 3e 3c 68 74 6d 6c 20 69 74 65 6d 73 63 6f 70 65 3d 22 22 20 69 74 65 6d 74 79 70 65 3d 22 68 74 74 70 3a 2f ... > <Buffer 3c 21 64 6f 63 74 79 70 65 20 68 74 6d 6c 3e 3c 68 74 6d 6c 20 69 74 65 6d 73 63 6f 70 65 3d 22 22 20 69 74 65 6d 74 79 70 65 3d 22 68 74 74 70 3a 2f ... > -1 仍返回。

所以我的问题是,我在做什么错,因此无法正确比较缓冲区?任何建议/批评都欢迎。

1 个答案:

答案 0 :(得分:2)

您必须使用相同的编码进行比较:

//:Buffer Comparison
const fs = require('fs')
fs.readFile(__dirname+"/test.jpg",(e,buffer)=>{
 let testParse = Buffer.from(buffer.toString('utf8'), 'utf8');
 let editable  = Buffer.compare(buffer, testParse);
 console.log("----: wrong method :----")
 console.log(buffer);
 console.log(testParse);
 console.log(editable);
 // You have to compare them in the same encoding :
 console.log("----: right method :----")
 let goodParse = Buffer.from(buffer.toString('utf8'));
 let editable2  = goodParse.compare(Buffer.from(buffer.toString('utf8')));
 console.log(buffer);
 console.log(goodParse);
 console.log(editable2);
})

如您所见,我们将图像加载为缓冲区,然后将其解析为utf8,因此,如果您对其进行修改,然后将其与原始buffer进行比较。由于修改后的内容已解析为utf8,因此在比较时也必须将原始内容解析为utf8

希望您能理解该解释。

控制台输出:

----: wrong method :----
<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ff db 00 43 00 08 06 06 07 06 05 08 07 07 07 09 09 08 0a 0c 14 0d 0c 0b 0b 0c 19 12 13 0f ... >
<Buffer ef bf bd ef bf bd ef bf bd ef bf bd 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ef bf bd ef bf bd 00 43 00 08 06 06 07 06 05 08 07 07 07 09 09 08 ... >
1
----: right method :----
<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ff db 00 43 00 08 06 06 07 06 05 08 07 07 07 09 09 08 0a 0c 14 0d 0c 0b 0b 0c 19 12 13 0f ... >
<Buffer ef bf bd ef bf bd ef bf bd ef bf bd 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ef bf bd ef bf bd 00 43 00 08 06 06 07 06 05 08 07 07 07 09 09 08 ... >
0