首页 > 解决方案 > 使用 Buffer.compare / Buffer.from 遇到奇怪的行为

问题描述

我正在尝试修改缓冲区,但是在修改它们时我希望它们在 utf-8 中,所以我尝试通过myBuffer.toString('utf8')但是如果我不做任何更改并尝试将其转换回通过Buffer.from(myBuffer, 'utf8'),我会看到一个全新的缓冲区有时。

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

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

//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仍然返回。

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

标签: node.jsbuffer

解决方案


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

//: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

推荐阅读