它似乎很简单,但我无法找到如何将一个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);
这个解决方案似乎有效,但有没有更简单的方法呢?
它也适用于如下数组:
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
正确订购时才有效.
是的,有一种简单的方法,无需手动编写循环(循环仍然存在于后台某处):
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
正确订购时才有效.