从数组(包含整数)创建ArrayBuffer,然后再次返回

Create ArrayBuffer from Array (holding integers) and back again

本文关键字:然后 返回 ArrayBuffer 创建 数组 包含 整数      更新时间:2023-09-26

这看起来很简单,但我找不到如何将充满整数的Array转换为ArrayBuffer,然后再转换回Array。有很多字符串被转换为ArrayBuffer的例子,比如这里的
使用这些例子,我创建了这个:

/**
 * Convert string to array buffer.
 *
 * @param {Array.<int>} array
 * @returns {ArrayBuffer}
 */
self.arrayToArrayBuffer = function( array ) {
    var length = array.length;
    var buffer = new ArrayBuffer( length * 2 );
    var view = new Uint16Array(buffer);
    for ( var i = 0; i < length; i++) {
        view[i] = array[i];
    }
    return buffer;
}

然后数组也需要再次转换回来。为此,我使用:

var array = new Uint16Array(arrayBuffer);

这个解决方案似乎有效,但没有更简单的方法可以做到这一点吗?

更新

它也应该适用于这样的数组:

var array = [3,7426,78921]

是的,有一种简单的方法不需要手动编写循环(循环仍然存在于后台):

new Uint16Array([1,2,3]);

仅此而已。当然,浮点数会向下取整,大数字会溢出。

正在将类型化数组转换为缓冲区

任何类型数组的缓冲区都可以通过.buffer属性访问,因为任何都可以在MDN:上读取

new Uint16Array([1,2,3]).buffer;

选择正确类型的数组

请注意,上述Uint16Array将只保存0和65535之间的整数(无浮点)要保存任何javascript编号1,您需要使用Float64Array-最大的一个,总共占用8个字节。

1:这是不受限制的双,似乎是64位IEEE 754数字

这是我创建的一张地图,它映射了一些与数字数据类型相关的重要信息:

var NUMBER_TYPE = [
  {name: "uint8",   bytes:1, max:        255,       min: 0,                floating: false, array: Uint8Array},
  {name: "int8",    bytes:1, max:        127,       min: -128,             floating: false, array: Int8Array},
  {name: "uint16",  bytes:2, max:      65535,       min: 0,                floating: false, array: Uint16Array},
  {name: "int16",   bytes:2, max:      32767,       min: -32768,           floating: false, array: Int16Array},
  {name: "uint32",  bytes:4, max: 4294967295,       min: 0,                floating: false, array: Uint32Array},
  {name: "int32",   bytes:4, max: 2147483647,       min: -2147483648,      floating: false, array: Int32Array},
  {name: "float64", bytes:8, max: Number.MAX_VALUE, min: Number.MIN_VALUE, floating: true , array: Float64Array}
];

Float 32丢失了,因为我无法为它计算必要的信息。该映射可以用于计算最小类型的数组,您可以将数字放入:

function findNumberType(num) {
    // detect whether number has something after the floating point
    var float = num!==(num|0);
    // Prepare the return variable
    var type = null;
    for(var i=0,l=NUMBER_TYPE.length; i<l; i++) {
      // Assume this type by default - unless break is hit, every type ends as `float64`
      type = NUMBER_TYPE[i];
      // Comparison asserts that number is in bounds and disalows floats to be stored 
      // as integers
      if( (!float || type.floating) && num<=type.max && num>=type.min) {
          // If this breaks, the smallest data type has been chosen
          break;
      }
    }
    return type;
}

用作:

var n = 1222;
var buffer = new (findNumberType(n).array)([n]);

请注意,只有在正确订购了NUMBER_TYPE的情况下,这才有效。

不能直接使用ArrayBuffer,但可以使用from方法从普通数组创建类型化数组:

let typedArray = Int32Array.from([-2, -1, 0, 1, 2])
相关文章: