从 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);
}
考虑输入 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);
}