如何在ArrayBuffer中存储32位整数?

3
我似乎不理解Uint32Array。根据我对Uint8Array的了解,我可以将一个数字放在数组中(Uint8Array([16])Uint8Array([96,56])),结果完全一样。然而,当我尝试对一个较大的数字进行相同的操作,例如Uint32Array([21640]),它似乎被截断了。在这种情况下,21640应该等于5488(十六进制),但我只得到了88。这实际上是如何工作的?
编辑:详细说明
我还尝试将几个ArrayBuffer连接在一起。如果我没弄错的话,readAsArrayBuffer会生成一个Uint8Array,我正在尝试使用https://gist.github.com/72lions/4528834添加一些32位数。

有关Uint8Array的信息和示例非常丰富,而对于Uint32Array的内容很少,这使我认为其中的32个之一可以像4个8位那样存储值。


“似乎”?不是,因为你无法将32位装入8位。你需要将其分解。 - Dave Newton
@DaveNewton 有什么建议可以将它分解成 Uint8Array(4),使其变成 88 54 00 00 - Edward
它运行良好。可能是你的十六进制打印程序只处理字节出了问题。如果不展示代码,无法确定是否是这个问题。 - John
2个回答

2

无符号8位数字的最大值为255。较大的数字将根据操作系统/ CPU进行截断或翻转。如果您想将32位数字转换为8位数组,请尝试类似以下的方法。

var number = 21640;
var byte1 = 0xff & number;
var byte2 = 0xff & (number >> 8);
var byte3 = 0xff & (number >> 16);
var byte4 = 0xff & (number >> 24);

var arr1 = Uint8Array([byte1,byte2,byte3,byte4]);

根据需要使用的小端或大端,创建数组时只需反转字节顺序即可。


0

这里有一个工作示例,在控制台中显示5488

    var bigNumber = new Uint32Array([21640]);
    console.log(bigNumber[0].toString(16));

由于您已经添加了更多的问题。如果您想要进行转换

var byte1 = 0x88;
var byte2 = 0x54;
var byte3 = 0;
var byte4 = 0;

var bigValue = (byte4 << 24) | (byte3 << 16) | (byte2 << 8) | (byte1);

console.log(bigValue);

虽然您需要考虑字节序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接