簡體   English   中英

ArrayBufferView 未捕獲錯誤:INDEX_SIZE_ERR:DOM 異常 1

[英]ArrayBufferView Uncaught Error: INDEX_SIZE_ERR: DOM Exception 1

我從 python 服務器通過 websocket 發送二進制數據:

data = struct.pack('!BI', 2, 1)
channel.send(channel.BINARY, data)

數據發送工作正常。 在客戶端 javascript 得到它是這樣的:

onbinarydata: function(data) {
    alert(data.byteLength);
    >> 5
    var array = new Uint8Array(data,0,1);
    alert(array[0]);
    >> 2
    var array2 = new Uint32Array(data,1,5);
    >> Uncaught Error: INDEX_SIZE_ERR: DOM Exception 1
    alert(array2[0]);

這怎么會發生? 字節長度減去字節偏移量是 4,BYTY_ELEMENT_SIZE 也是 4。讀取第一個值沒有問題,但接下來總是引發錯誤,無論它是什么類型。 即使我只像這樣設置字節偏移量

var array2 = new Uint32Array(data,1);

有一個錯誤。

不能創建偏移量不能被 4 整除的 int32/uint32 數組。int16/uint16 和 2 也是如此。

這是CPU架構的限制。

讓這兩個變量成為A:Uint16B:Uint8 您可以使用不同的方法將它們 map 到字節中:

  • BBAA (將值 B 放入 Uint16)
  • 0BAA / B0AA (跳過 1 個字節進行對齊)
  • AAB (對齊重新排序)。

如果您不想考慮 big-/little-endiad、重新排序和其他東西...即,如果出於某種原因您仍想將變量作為BAA放入字節中,請使用以下想法:

將每個未對齊的變量放入相應大小的緩沖區中並逐字節復制。 如果 misalign 為 2 個字節,則可以按對字節進行復制。

var array = new Uint8Array(data,0,1);
alert(array);

var array2 = new Uint8Array(data,1,5);
var abuf2 = new ArrayBuffer(4);
var abuf2_8 = new Uint8Array(abuf2);
// using `subarray` won't help, cause it doesn't create a copy like `slice`
// and the same data will have the same inconsistent memory alignment
for (var i = 0; i < 4; i++) abuf2_8[i] = array2[i];
var abuf2_32 = new Uint32Array(abuf2);
alert(abuf2_32[0]);

順便說一句,在 js 中有一些現成的打包/解包代碼:

類似於php 包

我的代碼對你來說可能更有趣,因為有 2 個類:打包成二進制字符串和打包成數組緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM