【问题标题】:Dealing with uint8_t in javascript在 javascript 中处理 uint8_t
【发布时间】:2013-04-13 02:21:42
【问题描述】:

G'day 人民,

我正在使用 MavLink 获取 GPS 信息。其中一种消息类型是 GPS_STATUS,MavLink 使用一系列 uint8_t[20] 对其进行描述。

如果我运行以下代码:

console.log(' sat prn: ' + message.satellite_prn);
console.log(' sat prn: ' + JSON.stringify(message.satellite_prn));
console.log(' sat prn: ' + JSON.stringify(new Uint8Array(message.satellite_prn)));

我得到以下输出:

 sat prn: <weird charcaters...>
 sat prn: "\u0002\u0005\n\f\u000f\u0012\u0015\u0019\u001a\u001b\u001d\u001e\u001f\u0000\u0000\u0000\u0000"
 sat prn: {"BYTES_PER_ELEMENT":1,"buffer":{"byteLength":0},"length":0,"byteOffset":0,"byteLength":0}

显然它不起作用。我需要一种方法来获取每个元素的 int 值。

我找到了这个https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays?redirectlocale=en-US&redirectslug=JavaScript_typed_arrays

这让我觉得我可以做到以下几点:

satellite_prn = Array.apply([], new Uint8Array(message.satellite_prn));
satellite_prn.length === 20;
satellite_prn.constructor === Array;

但是当我通过 JSON 对其进行字符串化时,它会报告 [],我认为这是一个空数组。

有人知道我该怎么做吗?我知道数据是一个由 20 个无符号 8 位整数组成的数组。我只需要知道如何访问或解析它们。

注意:我使用的是 node.js,但这不应该影响我正在做的事情。这就是我使用 console.log 的原因,因为它在 node.js 中很有用。

【问题讨论】:

    标签: javascript type-conversion uint8t


    【解决方案1】:

    您的代码有两个问题:

    1. message.satellite_prn 是字符串而不是数组
    2. Unit8Array需要加载.set

    要从message.satellite_prn 获取数字数组,请执行以下操作:

    var array = message.satellite_prn.map(function(c) { return c.charCodeAt(0) })
    

    要加载ArrayBuffer,请执行以下操作:

    var buffer = new ArrayBuffer(array.length);
    var uint8View = new Uint8Array(buffer);
    uint8View.set(array);
    

    理想情况下,您不需要遍历字符串。如果您从 XMLHttpRequest 的最新实现中获取数据,例如xhr2,您可以设置:

    responseType = "arraybuffer"
    

    【讨论】:

    • 谢谢汤姆,这为我澄清了事情。就我而言,我从一些硬件获取数据,底层实现是 c。这就是为什么我必须处理这个问题。我实际上用一个解决方案回答了自己,但我更喜欢你的解决方案,因为它解释了 Uint8Array 的使用。 :-)
    【解决方案2】:

    看起来问题是我对如何在 javascript 中处理二进制数据的理解。我发现我可以通过 charCodeAt() 执行以下操作以获取以 10 为底的数据。

    以下是允许我遍历 20 个无符号 8 位整数并将每个值作为小数获取的代码:

    for(var i = 0, l = message.satellite_prn.length; i < l; i++) {
        console.log(' Satellite ' + i + ', id: ' +
            parseInt(message.satellite_prn.charCodeAt(i), 10)
        );
    }
    

    我怀疑可能有一个函数允许我将二进制数据转换为数组,但由于未知原因,Uint8Array 似乎对我不起作用。但是上面确实如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多