当前位置:  开发笔记 > 编程语言 > 正文

从Array(保持整数)创建ArrayBuffer并再次返回

如何解决《从Array(保持整数)创建ArrayBuffer并再次返回》经验,为你挑选了1个好方法。

它似乎很简单,但我无法找到如何将一个Array填充整数转换为一个ArrayBuffer并重新转换为一个整数Array.有很多的例子,其中字符串转换为ArrayBuffer例如像在这里.
使用这些例子我创建了这个:

/**
 * Convert string to array buffer.
 *
 * @param {Array.} 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);

这个解决方案似乎有效,但有没有更简单的方法呢?

UPDATE

它也适用于如下数组:

var array = [3,7426,78921]

Tomáš Zato -.. 25

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

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}
];

浮标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=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正确订购时才有效.



1> Tomáš Zato -..:

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

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}
];

浮标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=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正确订购时才有效.


任何类型化数组都有`.buffer`属性
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有