2016-04-27 62 views
1

我在javascript下列對象:轉換數據結構的二進制數據

var arr = { 
    'id': 23, // uint32 
    'login': 'some string' // char[16] 
}; 

我想轉換此對象爲二進制數據(數組緩衝液),並將其發送到服務器。我已經提出了這樣的事:

var buffer = new ArrayBuffer(36); 
var idView = new Int32Array(buffer, 0, 1); 
idView[0] = 23321; 
var loginView = new Int16Array(buffer, 4, 16); 
loginView = "Random username"; 

所以不得不在idView變量的4個字節(1 INT32)和loginView可變32個字節(16 INT16)。

我想通過AJAX發送它的二進制數據,但是當我檢查服務器端字節的常用3我越來越:

[25 91 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

這是完全錯誤的。怎麼了?

回答

0

這是一個非常正確的輸出。

由於Node.js的is basically a Uint8ArrayBuffer,你可以使用Uint8Array作爲調試視圖:

var debugView = new Uint8Array(buffer); 

console.log(debugView); // [25, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

有代碼中的線條,但你可能沒有想到:

loginView = "Random username"; 

它只是分配舊的普通StringloginView,而不是用整數填充緩衝區。

什麼,你可能想要做的是這樣的:

"Random username".split('').forEach((x, i) => loginView[i] = x.charCodeAt(0)); 

顯然,這是不可能的指定字符要麼類型數組。