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字节流解析成生活中常见的十进制数字,而且最后一种方法更加灵活方便。