从 Uint8Array 转换为 ArrayBuffer 需要 32 个字节?

Converting from a Uint8Array to an ArrayBuffer prepends 32 bytes?

考虑输入 bytes,它是一个 400byte Uint8Array。以下代码首先通过 .buffer 方法将其转换为 ArrayBuffer ,随后转换为 Float32Array

  static bytesToFloatArray(bytes) {
      let buffer = bytes.buffer; // Get the ArrayBuffer from the Uint8Array.
      let floats = new Float32Array(buffer);
      return floats
  }

令人惊讶的是,到 ArrayBuffer 的转换会在前面加上 32 个字节 - 这反映在后续 [=20= 的开头有 8 个额外的“0”浮点值]Float32Array :

为什么 buffer 方法添加 32 个字节 - 如何避免(或更正)?

Post:@Bergi 的回答是正确的,我什至没有查看创建 Uint8 的缓冲区。

我无法重现您在 chrome 控制台中的行为,但您始终可以求助于使用 DataView 进行细粒度控制,如下所示:

(注意字节顺序,我没有测试下面的代码,我可能在字节顺序上做错了)

let test8 = new Uint8Array(400);
test8.forEach((d,i,a) => a[i] = 0xff * Math.random() | 0);

function c8to32(uint8, endian = false){ //big endian by default
    var cpBuff = new ArrayBuffer(uint8.length),
        view = new DataView(cpBuff);
    for (let i = 0,v = void(0); i < uint8.length; i += 4){
        if(!endian) { //big
            v =   uint8[i] << 24 
                | uint8[i + 1] << 16 
                | uint8[i + 2] << 8 
                | uint8[i + 3];
        } else { //little
           v =    uint8[i] 
                | uint8[i + 1] << 8 
                | uint8[i + 2] << 16
                | uint8[i + 3] << 24;
        }
        view.setFloat32(
            i,
            v,
            endian
        );
    }
    return cpBuff;
}

document.getElementById("resultbig").textContent = c8to32(test8).byteLength;
document.getElementById("resultlittle").textContent = c8to32(test8, true).byteLength;
<div id="resultbig">test</div>
<div id="resultlittle">test</div>

Why does the buffer method add the 32 bytes?

没有。缓冲区最初有 432 个字节,甚至在 Uint8Array 被创建之前。不同之处在于使用 an offset and/or a length 的类型化数组,它本质上将视图限制在缓冲区的一部分。

And how can that be avoided (or corrected)?

使用相同的偏移量和调整后的长度:

function bytesToFloatArray(bytes) {
   return new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength/Float32Array.BYTES_PER_ELEMENT);
}