【问题标题】:How to store a 32-bit integer in an arraybuffer?如何在数组缓冲区中存储 32 位整数?
【发布时间】:2020-02-05 19:36:53
【问题描述】:

我似乎不理解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 个中的一个会存储一个值,就好像它是 8 个中的 4 个一样。

【问题讨论】:

  • “看起来”?它,因为你不能将 32 位放入 8 中。你需要将它分解。
  • @DaveNewton 关于如何将其分解为Uint8Array(4) 使其变为88 54 00 00 的任何建议?
  • 它工作正常。您的十六进制打印例程仅处理字节一定有问题。如果不显示任何代码,就无法确定这是问题所在。

标签: javascript uint8array


【解决方案1】:

无符号 8 位数字的最大值为 255。更大的数字将被截断或翻转,具体取决于 os/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]);

创建数组时只需颠倒字节顺序,具体取决于您想要小端还是大端。

【讨论】:

    【解决方案2】:

    这是一个在控制台中显示 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);
    

    虽然您需要考虑字节序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多