Javascript 转换错误:ArrayBuffer到Int16Array

Javascript 转换错误:ArrayBuffer到Int16Array,javascript,firefox,arraybuffer,Javascript,Firefox,Arraybuffer,这应该是直截了当的,但我不确定为什么会出现错误,我使用的是带有ArrayBuffer的构造函数作为参数,如中所示,但我将错误作为无效参数得到,(对于dataview,我已检查,数据仅为Int16) 代码是: var view= DataView(arrayBuf); console.log('arrayBuf.byteLength : '+arrayBuf.byteLength); console.log('data at 0 : '+view.g

这应该是直截了当的,但我不确定为什么会出现错误,我使用的是带有ArrayBuffer的构造函数作为参数,如中所示,但我将错误作为无效参数得到,(对于dataview,我已检查,数据仅为Int16)

代码是:

        var view= DataView(arrayBuf);
        console.log('arrayBuf.byteLength : '+arrayBuf.byteLength);
        console.log('data at 0 : '+view.getInt16(0));
        console.log('data at 1 : '+view.getInt16(1));
        var int16arry = new Int16Array(arrayBuf);
控制台输出为:

"arrayBuf.byteLength : 117" 
"data at 0 : 22720" 
"data at 1 : -16315"
Error: invalid arguments

我的错误是什么?

简单的回答是,您的阵列缓冲垫大小不正确。您可以使用:

var int16Array = new Int16Array(arrayBuf, 0, Math.floor(arrayBuf.byteLength / 2));
解决这个问题

具体案例注释:
我已尝试读取您的库的源代码,但我不明白您为什么会获得额外的字节(或缺少的字节)。

你得到的数据应该是16位整数,但由于某种原因,你有其他数据占用了不均匀的字节数,据我所知,数据源中也应该有一些双精度(javascript浮动),这意味着“破解”这个问题可能行不通。

Hmm,16位整数数组的字节数应始终为偶数。如果你试着计算你的数组中有多少整数16,结果是58,5整数,这是行不通的。你在里面还垫了什么?如果你确实有不同的数据类型,我有一个脚本给你,如果你想的话it@Snellface不幸的是,这些arraybuffers是我从一个没有文档的库中收到的,它们是经过编码的数据包,当我使用DataView单独复制它们时,它们工作得很好,我也不知道如何,数据包/Int16Array的长度是
117
而不是
117/2
,我正在增加
view.getInt16(0)
,为0,1,2,而不是`,2,4…arrayBuf.ByTeleLength提供缓冲区中的字节数,无论其类型如何。因此,您的缓冲区要么接收不正确,要么包含“仅”16位整数以外的内容。如果您逐个循环并使用getInt16提取它们,您能确保您获得的数据实际上是您期望得到的数据吗?在阅读完最后一个“完整”int16之后,尝试阅读一个int8,看看得到了什么?Ps,您可以尝试以下操作:var int16arry=new Int16Array(arrayBuf,0,Math.floor(arrayBuf.bytellength/2));这将最终删除最后一个“半”16位int,但我称之为hack,因为您不知道为什么会有一个额外的字节,以及它的用途:P您可以在链接的文档中读取它,但我在这里使用的函数包含以下参数:Int16Array(缓冲区、开始索引、要读取的条目数);顺便问一下,你在用什么图书馆?或者更具体地说,它是用什么语言写的?(如果您使用的是javascript库,您可能可以查看提供数组缓冲区的函数的源代码,这可能会为您提供接收额外字节的原因的线索)我找到了问题的解决方案,使用
UInt8Array
,它可以解决奇数/偶数问题,thx表示在这方面花费的时间。您仍然得到正确的值吗?您告诉我您使用的函数的名称意味着它将使用16位整数(“\u i16”在名称的末尾),如果它能以任何方式工作,那就太好了!