gpt4 book ai didi

javascript - 从数组(保存整数)创建 ArrayBuffer 并再次返回

转载 作者:可可西里 更新时间:2023-11-01 02:30:58 28 4
gpt4 key购买 nike

这看起来很简单,但我不知道如何将一个用整数填充的 Array 转换为一个 ArrayBuffer 然后再转换回一个 Array。有很多示例将字符串转换为 ArrayBuffer,例如 here .
使用这些示例,我创建了这个:

/**
* 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]);

就是这样。当然, float 会向下舍入,大数会溢出。

将类型数组转换为缓冲区

任何类型数组的缓冲区都可以通过.buffer 属性访问,如anyone can read on MDN :

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

选择正确的类型数组

请注意,提到的 Uint16Array 只会保存 0 到 65535 之间的整数(无 float )。要保存任何 javascript Number1,您需要使用Float64Array - 最大的一个,总共占用 8 个字节。

1: 是不受限制的 double,看起来是 64 位 IEEE 754 number

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

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 丢失了,因为我无法为其计算必要的信息。 map 本身可用于计算可容纳数字的最小类型数组:

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 正确排序时才有效。

关于javascript - 从数组(保存整数)创建 ArrayBuffer 并再次返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34089569/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com