看起来很简单,但我找不到如何将填充了整数的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]
,例如 here 。
使用这些示例我创建了这个:
{{1}}
然后阵列也需要再次转换回来。为此,我使用:
{{1}}
这个解决方案似乎有效,但有没有更简单的方法呢?
它也适用于像:
这样的数组{{1}}
答案 0 :(得分:23)
是的,有一种简单的方法,无需手动编写循环(循环仍然存在于背景中):
new Uint16Array([1,2,3]);
这就是全部。当然,浮动数字将向下舍入,大数字将溢出。
任何类型化数组的缓冲区都可以通过.buffer
属性访问,anyone can read on MDN:
new Uint16Array([1,2,3]).buffer;
请注意,提到Uint16Array
只会在0到65535之间保存整数(无浮点)。要保存任何javascript编号 1 ,您需要使用{{1 } - 最大的一个,总共占用8个字节。
1:哪个是无限制的双倍,似乎是64位IEEE 754 number
这是我创建的地图,它映射了一些与数字数据类型相关的重要信息:
Float64Array
Float 32丢失,因为我无法为其计算必要的信息。实际上,地图可用于计算您可以在以下位置拟合数字的最小类型数组:
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}
];
用作:
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]);
订单正确的情况下才能使用此功能。
答案 1 :(得分:2)
您无法直接使用ArrayBuffer,但可以使用 from 方法从普通数组创建一个类型化数组:
let typedArray = Int32Array.from([-2, -1, 0, 1, 2])