将协议缓冲区中的二进制双精度数组转换为javascript数

时间:2017-03-23 19:37:17

标签: javascript c++ protocol-buffers zeromq

我使用超过zeroMQ的协议缓冲区将图形数据从C ++发送到Javascript前端:

message RawData
{
   Type type = 1;
   bytes data = 2;
}

当我调用RawData.getData()时,我会得到类似的东西(通常更长):

数据:0,0,0,0,0,0,0,64,1,118,62,112,8,12,63

这是两个8字节的数字,其中数组中的每个索引都是1个字节。

如何在Javascript中将其转换为双重表示?

修改 我最终将协议缓冲区消息更改为repeated double data = 2;

这消除了转换的需要

1 个答案:

答案 0 :(得分: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