JavaScript如何将Float32编码的Buffer解析为数值数组或JSON对象
实现方案
完全可以实现,你收到的12字节Buffer刚好对应3个4字节长度的IEEE754单精度浮点数(Float32),按顺序每4字节切分后,和你给出的数值映射关系完全匹配,可以直接解析为目标数组或JSON对象。
解析为数值数组
以Node.js环境为例,直接通过Buffer内置的Float读取方法即可实现,注意匹配数据源的字节序:
// 初始化原始Buffer,先去掉十六进制字符串里的空格 const rawBuffer = Buffer.from('40 48 f5 c3 3f b4 7a e1 3f 35 c2 8f'.replaceAll(' ', ''), 'hex'); const floatArray = []; // Float32单精度占4字节,按偏移量循环读取,此处为大端序读取(和给出的十六进制顺序匹配) for (let offset = 0; offset < rawBuffer.length; offset += 4) { floatArray.push(rawBuffer.readFloatBE(offset)); } // 直接输出会带浮点数固有精度误差:[3.140000104904175, 1.409999966621399, 0.7099999785423279] // 按需保留小数位即可得到目标值 const targetArray = floatArray.map(num => Number(num.toFixed(2))); console.log(targetArray); // [3.14, 1.41, 0.71]
映射为指定格式JSON对象
拿到解析后的数组后,按字段名映射即可:
const targetJson = { value1: targetArray[0], value2: targetArray[1], value3: targetArray[2] }; console.log(targetJson); // 输出:{ value1: 3.14, value2: 1.41, value3: 0.71 }
注意:如果读取出来的数值明显异常,说明字节序不匹配,将代码里的
readFloatBE(大端序)替换为readFloatLE(小端序)重试即可。浮点数解析后的微小误差是IEEE754编码的固有特性,不属于解析错误。
内容的提问来源于stack exchange,提问作者MeerArtefakt
相关产品推荐
相关产品推荐

