node.js解析Buffer字节流不同方式的区别

本文介绍了四种解析Buffer字节流的方法,包括直接转换为字符串、使用字符串解码器、转换为JSON格式及按多字节解析成十进制数字。适用于不同场景下对字节流的解析需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

buffer字节流的一般形式如下:<Buffer 66 00 68 00 71 00 77 00 68 00 67 00 61 00 64 00 73 00>
buffer字节流一般由一系列十六进制数字组成,一个十六制数字占用一个字节,在unicode编码格式中,两个字节组成一个字。
以下是解析buffer字节流的几种方法(默认编码格式是utf-8):
1.buffer.toString()
此方法的一般形式是buf.toString(),其中buf指被解析的字节流。在这里插入图片描述
如上图的ASCII表所示,这种方法的原理是将字节流中的十六进制数值解析成“图形”的那一列中图形符号,所以常常会出现特殊的符号,感觉像乱码,如下所示:在这里插入图片描述
2.string_decoder(字符串解码器)
此方法的一般形式如下:

const { StringDecoder } = require('string_decoder');
const decoder = new StringDecoder('utf8');
console.log(decoder.write(cent));

上面代码中,cent变量表示被解析的字节流。
这种方法的原理同第一种方法buffer.toString()。

3.JSON.stringify(Buffer)
这种方法是将每个字节对应的十六进制数字解析成相应的十进制数字,然后输出JSON格式的字符串对象。如下实例:要被解析的Buffer字节流为`

<Buffer 66 00 68 00 71 00 77 00 68 00 67 00 61 00 64 00 73 00>

在node.js中创建相应字节流格式如下:

const bufTry=Buffer.from([0x66,0x00,0x68,0x00,0x71,0x00,0x77,0x00,0x68,0x00,0x67,0x00,0x61,0x00,0x64,0x00,0x73,0x00]);

然后进行解析和输出,代码如下:

const json_bufTry=JSON.stringify(bufTry);
console.log(json_bufTry);

输出结果如下图:
在这里插入图片描述
4.Buffer.readUIntBE(offset,byteLength).toString(16)+parseInt(str_buf,16)
第三种方法已经可以把字节流的每个字节从十六进制解析成生活中常见的十进制了。但是,如果需要按多个字节的形式解析呢?即将字节流中任意多个十六进制数字合起来解析成常用见的十进制数字,这就需要用**Buffer.readUIntBE(offset,byteLength).toString(16)**这种方法了。其中offset指要解析的字节流的起始字节位置,byteLength指要解析的字节流的长度,这个长度大于0,小于等于6。这种方法可以从 buf 中指定的 offset 读取 byteLength 个字节,并将读取的值解析为二进制补码值,即将这1到6个字节长度的字节流抽取出来变成字符串,这里先把字节串称为一个变量str_buf。然后运用str_buf=parseInt(str_buf,16);这一行代码就可以把字符串str_buf转化成十进制数字了。下面是一个实例代码:

 const bufTry=Buffer.from([0x66,0x00,0x68,0x00,0x71,0x00,0x77,0x00,0x68,0x00,0x67,0x00,0x61,0x00,0x64,0x00,0x73,0x00]);//创建一个字节流
let str_buf=bufTry.readUIntBE(6,2).toString(16);//切分字节流第6个字节开始的两个字节出来,并且转换成字符串形式
str_buf=parseInt(str_buf,16); //将切分出来的字符串转化成常见的十进制数字
console.log(str_buf);

结果如下:
在这里插入图片描述
这样,就将第六个字节开始的后面两个字节从十六进制数字解析成了常见的十进制数字了。

总结
从上面四种方法可以看出,前面两种方法适合将Buffer字节流解析成ASCII符号,后面两种方法是十六进制Buffer字节流解析成生活中常见的十进制数字,而且最后一种方法更加灵活方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值