ArrayBufferView未捕获错误:INDEX_SIZE_ERR:DOM异常1

时间:2012-04-07 09:37:09

标签: javascript python binary websocket arraybuffer

我通过来自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);

有错误。

1 个答案:

答案 0 :(得分:0)

无法创建int32 / uint32数组,其偏移量不能被4整除。对于int16 / uint16和2也是如此。

这是CPU架构的限制。

让这2个变量为A:Uint16B:Uint8。您可以使用不同的方法将它们映射到字节:

  • BBAA(将值B放入Uint16)
  • 0BAA / B0AA(跳过1个字节进行对齐)
  • AAB(重新排列对齐)。

如果您不想考虑big- / little-endiad,重新排序和其他内容...即如果您仍然希望将变量放入BAA由于某种原因,请使用以下内容想法:

将每个未对齐的变量放入相应的大小缓冲区并逐字节复制。 如果未对齐是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]);

BTW在js中有一些现成的打包/解包代码:

php pack

类似

我的代码可能对您更有趣,因为有两个类:打包成二进制字符串并打包到arraybuffer。