在这里想记录一下 我平常经常用到的一些处理Buffer数据的方法,主要是通过node的一些方法处理的,这边我介绍的基本是我的一些应用场景,如果需要了解的更详细 更官方 可以去buffer缓冲区查看:
网址: https://nodejs.cn/api/buffer.html
1、写入单精度浮点数(小端模式)
_buffer.writeFloatLE(Num)
示例
代码:
/**
* 写入单精度浮点数(小端模式)
*/
function writeFloatLE(Num) {
let _buffer = Buffer.alloc(4);
_buffer.writeFloatLE(Num);
return _buffer.toJSON()['data'];
}
2、从指定 offset
处的 buf
读取 32 位大端序浮点数。
bufferData.readFloatBE(index, NO_ASSERT)
示例:
代码:
/**
* @param bufferData {Buffer} usb返回的Buffer数据
* @param sliceNum {int} 数据切片读取数量【选填,默认:4】
* @param offset {int} 数据读取索引偏移【选填,默认空】
* @return {Array} USB设备实际数据数组集合
* @private
*/
function _dataTransferFloatBE(bufferData, sliceNum, offset){
if (!Buffer.isBuffer(bufferData)) return false;
sliceNum = Utils.isNumber(sliceNum) ? sliceNum : 4;
if (Utils.isNumber(offset)) {
bufferData = bufferData.slice(offset);
}
let data = [];
bufferData.forEach(function(value, index){
if (index % sliceNum == 0){
data.push(bufferData.readFloatBE(index, NO_ASSERT));
}
});
return data;
}
3、一位数字转成16进制(转成16位符号)
_buffer.writeInt8(Number(Num), 0);
示例: 0 => 0x00
代码:
function writeUInt8LE(Num) {
let _buffer = Buffer.alloc(1);
_buffer.writeInt8(Number(Num), 0);
return _buffer.toJSON()['data'];
}
4、小端模式: 从 Buffer
读取的整数被解释为二进制补码有符号值。(这个方法会对一些超出正常范围的数据进行二进制的取反)
bufferData.readInt16LE(index, NO_ASSERT)
我现在处理的数据有高位和低位:
示例: 像以下这种格式
代码:
_dataTransfer(bufferData, sliceNum, offset){
if (!Buffer.isBuffer(bufferData)) return false;
sliceNum = Utils.isNumber(sliceNum) ? sliceNum : 2;
if (Utils.isNumber(offset)) {
bufferData = bufferData.slice(offset);
}
let data = [];
bufferData.forEach(function(value, index){
if (index % sliceNum == 0){
try {
data.push(bufferData.readInt16LE(index, NO_ASSERT));
} catch (e) {
}
} else {
}
});
return data;
}