2013-04-13 60 views
0

g'day人民,在javascript中處理uint8_t

我正在使用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中有效。

回答

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" 
+0

感謝湯姆,來闡明的事情對我來說。在我的情況下,我從一些硬件獲取數據,底層實現是c。這就是爲什麼我不得不處理這個問題。我實際上回答自己的解決方案,但我更喜歡你的,因爲它解釋了Uint8Array的使用。 :-) – Metalskin

0

看起來問題是我對如何處理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似乎沒有爲我工作。但是,上面呢。