【问题标题】:converting array of binary doubles in protocol buffer to javascript numbers将协议缓冲区中的二进制双精度数组转换为 javascript 数字
【发布时间】:2017-03-24 23:38:50
【问题描述】:

我在 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;

这消除了转换的需要

【问题讨论】:

  • 该示例似乎不代表二进制格式的协议缓冲区——不应该有前导零。双重表示是什么意思?
  • 双重表示是c++中的64位数字

标签: javascript c++ protocol-buffers zeromq


【解决方案1】:

只需将结果分成 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

【讨论】:

  • 这不起作用,返回的数字不是浮点数
  • 对不起,我以为你在谈论整数。将尝试为花车做这件事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多