我通过来自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);
有错误。
答案 0 :(得分:0)
无法创建int32 / uint32数组,其偏移量不能被4整除。对于int16 / uint16和2也是如此。
这是CPU架构的限制。
让这2个变量为A:Uint16
和B: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中有一些现成的打包/解包代码:
类似我的代码可能对您更有趣,因为有两个类:打包成二进制字符串并打包到arraybuffer。