首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >体验Buffer.compare / Buffer.from的奇怪行为

体验Buffer.compare / Buffer.from的奇怪行为
EN

Stack Overflow用户
提问于 2018-10-08 03:49:33
回答 1查看 93关注 0票数 1

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

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

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

代码语言:javascript
复制
//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);

然而,以下代码片段拒绝工作,并且editable始终为-1。以下是示例输出:

代码语言:javascript
复制
<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

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

代码语言:javascript
复制
<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

所以我的问题是,我做错了什么,以至于不能正确地比较缓冲区?欢迎任何建议/批评。

EN

回答 1

Stack Overflow用户

发布于 2018-10-11 23:34:46

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

代码语言:javascript
复制
//: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

我希望你能理解这个解释。

控制台输出:

代码语言:javascript
复制
----: 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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52692260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档