Javascript 在ArrayBuffer中存储类型化数组
我有一个由UINT8组成的数据数组缓冲区。每个都是按网络字节顺序(大端)。我的目标是将每个Uint8转换成小的endian顺序,然后将它们放回ArrayBuffer 我知道我可以通过使用类型化数组轻松地分离各个UINT,如下所示:Javascript 在ArrayBuffer中存储类型化数组,javascript,endianness,arraybuffer,typed-arrays,Javascript,Endianness,Arraybuffer,Typed Arrays,我有一个由UINT8组成的数据数组缓冲区。每个都是按网络字节顺序(大端)。我的目标是将每个Uint8转换成小的endian顺序,然后将它们放回ArrayBuffer 我知道我可以通过使用类型化数组轻松地分离各个UINT,如下所示: var uintArr = new Uint8Array(ArrayBuffer); 从那里我可以交换每个项目的尾数,并有一个小尾数UINT8数组 我不知道的是如何将该数组返回到ArrayBuffer中 在Javascript中有这样做的方法吗?ArrayBuffe
var uintArr = new Uint8Array(ArrayBuffer);
从那里我可以交换每个项目的尾数,并有一个小尾数UINT8数组
我不知道的是如何将该数组返回到ArrayBuffer中
在Javascript中有这样做的方法吗?ArrayBuffer是所有视图的通用字节数组。类型化数组仅仅意味着数组上有一个关联的类型,如uint8、int16等。所有Uin8Array、Int32Array等都是位于ArrayBuffer顶部的视图,用于以其表示的类型进行读写 (U) int8数组没有字节顺序,因为它们是单字节(即,无需重新排序)。字节需要表示更宽的值,如(u)int-16或-32(在ES7之前不支持64位整数,但您有32位和64位IEEE浮点) 通过视图读取或写入的任何内容都会备份到它们指向的同一个阵列缓冲区中—甚至可以为同一个缓冲区创建多个视图 要交换16位的顺序,只需使用UINT16阵列视图读取阵列缓冲区并手动交换:
var buffer16 = new Uint16Array(buffer); // use same buffer as for the Uin8Array view
for(var i = 0, v; i < buffer16.length; i++) {
v = buffer16[i];
buffer16[i] = ((v & 0xff) << 8) | ((v & 0xff00) >>> 8); // mask and shift the two bytes
}
body{font:16px monospace}
lol我真的没在想。当然,uint8只是一个字节。谢谢你详细而透彻的回答。
var buffer32 = new Uint32Array(buffer);
for(var i = 0, v; i < buffer32.length; i++) {
v = buffer32[i];
buffer32[i] = ((v & 0xff) << 24) | // mask, move byte 0 to 3
((v & 0xff00) << 8) | // mask, move byte 1 to 2
((v & 0xff0000) >>> 8) | // mask, move byte 2 to 1 unsigned
((v & 0xff000000) >>> 24); // mask, move byte 3 to 0 unsigned
}
var view = new DataView(buffer);
var alignedLength = ((buffer.length / 2)|0) * 2; // aligned to 16-bit
// 16-bit
for(var i = 0, v; i < alignedLength; i += 2) {
v = view.getUint16(i, false); // read as big-endian
view.setUint16(i, v, true); // write as little-endian
}