从数组(包含整数)创建ArrayBuffer,然后再次返回
Create ArrayBuffer from Array (holding integers) and back again
这看起来很简单,但我找不到如何将充满整数的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])
相关文章:
- 将元素移动到右侧,然后返回到左侧
- 如何点击标题中的链接,然后返回HTML、Javascript和CSS
- 如何比较两个数组,然后返回差异的索引
- 使用函数for循环遍历对象以更改值,然后返回结果
- Javascript:编写一个函数,接收一个数组,然后返回一个只有唯一数字的数组,只删除数组
- AngularJS工厂调用PHP,然后返回AngularJS
- 从mysql数据库中删除项目,然后返回最后一页
- 每次我点击我的网站,它都会重定向到home.html,然后返回到我点击的所需url
- 修改输入中的数组,然后返回输出
- 如何将 $http.put 封装到一个函数中,该函数执行某些操作,然后返回通过或失败的承诺
- Javascript 的提示,它接受简单的数学作为值,然后返回答案
- 铁:路由器工作很奇怪 - 将我发送到模板然后返回
- 在 中显示警告框 asp.net 将重定向到空白页,然后返回到原始页面
- 导演.js和涡轮链接 - 更改窗口哈希并使用然后返回
- Javascript函数,它接受可变数量的参数 - 更改它们的值 - 然后返回它们
- 我可以将字段保留在填充的表单中,即使我移动到其他页面然后返回
- javascript重定向到带有表单操作post的页面,然后返回到带有输入值的上一页
- 从垂直滚动到水平滚动,然后返回到垂直滚动
- 使用isNan()函数将参数从html传递给javascript,并检查值然后返回值
- 循环通过LI's在一个顺序中,然后返回另一个顺序,同时逐渐消失