我需要通过arrayBuffer
遍历二进制文件并检索1024个浮点集。我这样做:
// chunk_size = 1024
// chunk_len = 48
// response_buffer = ArrayBuffer
// response_buffer.byteLength = 49152
for (i = chunk_len; i > 0; i -= 1) {
switch (i) {
case (chunk_len):
// create view from last chunk of 1024 out of 49152 total
float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size));
// add_data(net_len, float_buffer);
break;
case 0:
break;
default:
float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size)), chunk_size);
//add_data(net_len, float_buffer);
break;
}
}
我的问题是,如果我在第一次运行时调用此缓冲区结束:
// i - 1 = 47 * chunk_size
new Float32Array(response_buffer, ((i - 1) * chunk_size));
同一个语句在我调用的下一次运行中失败:
new Float32Array(response_buffer, ((i - 1) * chunk_size), 1024);
虽然我可以阅读here,但那 我可以这样做:
Float32Array Float32Array(
ArrayBuffer buffer,
optional unsigned long byteOffset,
optional unsigned long length
);
问题:
在我的Float32Array
ArrayBuffer上声明第一个response_offer
视图后,为什么我的循环失败?
答案 0 :(得分:1)
我认为你在“默认”案件的第一行有一个额外的“)”。
float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size)), chunk_size);
应该是:
float_buffer = new Float32Array(response_buffer, ((i - 1) * chunk_size), chunk_size);
答案 1 :(得分:0)
因此。终于明白了...也许这有助于下一个人疑惑:
首先 - 我试图读取我的数据是错误的,这是 4字节单格式。
arrayBuffer
byteLength = 49182
这意味着我的数组中有很多条目。4 byte single format
,我发现有一些SO-help和searching,getFloat32
AND 可以读取这4个条目包含一个“真实”值因此,如果我有12000个数据点和49182/4 = 12288数据点,我的数据结构末尾将有288个空数据点。
所以我的二进制数据应该像这样存储:
0 - 1024 a
1025 - 2048 a
2049 - 3072 a
3072 - 4000 [a
4001 - 4096 b]
4097 - 5120 b
5121 - 6144 b
6145 - 7168 b
7169 - 8000 [b
8001 - 8192 c]
8193 - 9216 c
9217 - 10240 c
10240 - 11264 c
11264 - 12000 [c
12000 - 12288 0]
我的最终片段将包含288个空结果,因为1024个块中的3x4000数据点将返回一些空结果
为了阅读,我找到了一个不错的代码段here (dynamic high range rendering),这对我有所帮助:
// ...
raw_data = ...
data = new DataView(raw_data);
...
tmp_data = new Float32Array(byte_len / Float32Array.BYTES_PER_ELEMENT);
len = tmp_data.length;
// Incoming data is raw floating point values with little-endian byte ordering.
for (i = 0; i < len; i += 1) {
tmp_data[i] = data.getFloat32(i * Float32Array.BYTES_PER_ELEMENT, true);
}
现在我有一个单独的数组,我可以使用它来构建我的处理结构。