【问题标题】:How to read an ArrayBuffer with binary data in "4 byte single"/floating point/IEEE 754 encoded data?如何在“4 字节单”/浮点/IEEE 754 编码数据中读取二进制数据的 ArrayBuffer?
【发布时间】:2014-07-14 01:19:09
【问题描述】:

我需要通过 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
);

问题
为什么在我的 response_offer ArrayBuffer 上声明第一个 Float32Array 视图后我的循环失败?

【问题讨论】:

    标签: javascript filereader arraybuffer typed-arrays


    【解决方案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);
    

    【讨论】:

    • 好地方。但事实并非如此。当我使用硬编码数字时,我得到了同样的错误。请参阅上面的编辑。
    • 酷。很高兴你明白了。
    【解决方案2】:

    所以。终于明白了......也许这有助于下一个人想知道:

    首先 - 我在尝试读取我的数据时完全错了,这是 4 字节单一格式

    • 如果我有一个 arrayBufferbyteLength = 49182,这意味着我的数组中有很多条目。
    • 由于我的数组是4 byte single format,我发现一些SO-helpsearching 可以用getFloat32 读取AND 4 个条目包含一个“真实”值李>
    • 我的数据包含 3 个测量值,一个 4000 个数据点,以 1024 为单位逐列存储。
    • 因此,如果我有 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]
      
    • 我的最终 sn-p 将包含 288 个空结果,因为 1024 个块中的 3x4000 个数据点将返回一些空结果

    • 为了阅读,我找到了一个不错的 sn-p 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);
        }
      
    • 现在我有一个数组,我可以使用它来构建我的处理结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多