将协议缓冲区中的二进制双精度数组转换为 javascript 数字
converting array of binary doubles in protocol buffer to javascript numbers
我在 zeroMQ 上使用协议缓冲区将图形数据从 C++ 发送到 Javascript 前端:
message RawData
{
Type type = 1;
bytes data = 2;
}
当我调用 RawData.getData() 时,我得到这样的结果(通常更长):
数据:0,0,0,0,0,0,0,0,64,1,118,62,112,8,12,63
这是两个 8 字节的数字,其中数组中的每个索引都是 1 个字节。
如何将其转换为 Javascript 中的双重表示形式?
编辑:
我最终将协议缓冲区消息更改为 repeated double data = 2;
这消除了转换的需要
只需将结果分成8个元素部分,然后使用ArrayBuffer和Dataview挂载数字即可。示例:
function splitData(data) {
return data.reduce(function(a, b, c){
if(c % 8 == 0 && c !== 0){
a.push([]); };
a[a.length - 1].push(b);
return a;
}, [[]]);
}
function computeValues(data, littleEndian = false) {
var res = [];
splitData(data).forEach(numberElement=>{
var buffer = new ArrayBuffer(8);
var dv = new DataView(buffer);
numberElement.forEach((val, ix)=>dv.setUint8(littleEndian ? 7 - ix : ix, val));
res.push(dv.getFloat64(0));
});
return res;
}
var data = [0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 118, 62, 112, 8, 12, 63];
console.log(computeValues(data));
console.log(computeValues(data, true));
data.reduce
函数取自这个 SO 答案:Splitting a JS array into N arrays
JSFiddle:https://jsfiddle.net/z3fL39sr/12/
littleEndian 参数是指字节顺序。如果最重要的先出现,则将 littleEndian 设置为 true。如果需要,此页面将解释字节顺序:https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html
我在 zeroMQ 上使用协议缓冲区将图形数据从 C++ 发送到 Javascript 前端:
message RawData
{
Type type = 1;
bytes data = 2;
}
当我调用 RawData.getData() 时,我得到这样的结果(通常更长):
数据:0,0,0,0,0,0,0,0,64,1,118,62,112,8,12,63
这是两个 8 字节的数字,其中数组中的每个索引都是 1 个字节。
如何将其转换为 Javascript 中的双重表示形式?
编辑:
我最终将协议缓冲区消息更改为 repeated double data = 2;
这消除了转换的需要
只需将结果分成8个元素部分,然后使用ArrayBuffer和Dataview挂载数字即可。示例:
function splitData(data) {
return data.reduce(function(a, b, c){
if(c % 8 == 0 && c !== 0){
a.push([]); };
a[a.length - 1].push(b);
return a;
}, [[]]);
}
function computeValues(data, littleEndian = false) {
var res = [];
splitData(data).forEach(numberElement=>{
var buffer = new ArrayBuffer(8);
var dv = new DataView(buffer);
numberElement.forEach((val, ix)=>dv.setUint8(littleEndian ? 7 - ix : ix, val));
res.push(dv.getFloat64(0));
});
return res;
}
var data = [0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 118, 62, 112, 8, 12, 63];
console.log(computeValues(data));
console.log(computeValues(data, true));
data.reduce
函数取自这个 SO 答案:Splitting a JS array into N arrays
JSFiddle:https://jsfiddle.net/z3fL39sr/12/
littleEndian 参数是指字节顺序。如果最重要的先出现,则将 littleEndian 设置为 true。如果需要,此页面将解释字节顺序:https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html