ab2str()和str2ab()
ab2str(buf)的参数是ArrayBuffer或者类型类数组,转换的结果是String
function ab2str(buf) {
/*Int8Array:8位有符号整数,长度1个字节。
Uint8Array:8位无符号整数,长度1个字节。
Int16Array:16位有符号整数,长度2个字节。
Uint16Array:16位无符号整数,长度2个字节。
Int32Array:32位有符号整数,长度4个字节。
Uint32Array:32位无符号整数,长度4个字节。
Float32Array:32位浮点数,长度4个字节。
Float64Array:64位浮点数,长度8个字节。*/
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
str2ab(str)的参数是String,转换的结果是ArrayBuffer
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 每个字符占用2个字节
var bufView = new Uint8Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
asmCrypto.RSA_OAEP_SHA256.decrypt()的解密结果类型是Uint8arrayasmCrypto.RSA_OAEP_SHA256.decrypt()解密出来的明文不正确,总是少几个字节: 原因是送入的参数filekey,和iv不正确
调用第三方函数时,如果其返回值类型是Uint8array,不要在程序中使用Uint8array.buffer.
因为该Uint8array对象有可能是某个ArrayBuffer对象上的视图,Uint8array.buffer.byteLength不等于Uint8array.byteLength
Uint8Array的set 方法
uint8Array.set(index, value);
uint8Array.set(array, offset);
index
要设置的位置的索引。
value
要设置的值。
array
要设置的值的类型化或非类型化数组。
offset
要写入的值在当前数组中的位置的索引。备注
如果输入数组为 TypedArray,则两个数组可以使用相同的基础 ArrayBuffer。在此情况下,设置值时,就好像先将所有数据复制到未与任一数组重叠的临时缓冲区,然后再将临时缓冲区中的数据复制到当前数组中一样。
如果偏移量加上给定数组的长度超出当前 TypedArray 的范围,则将引发异常。
使用worker时报错
Failed to execute 'postMessage' on 'Worker': Value at index 0 is an untransferable 'undefined' value
原因是传递给postMessage的第二个参数不正确。postMessage的用法
var message = {foo: 'abc', bar: new Uint8Array(...)};
worker.postMessage(message, [message.bar.buffer])
注意第二个参数[]里面不能是类型化数组,必须是ArrayBuffer类型
局部函数访问全局变量
经常遇到一个js文件,使用一个函数作为命名空间。在此命名空间内定义了一些全局变量,函数,函数内的局部变量。命名空间内定义函数时可以使用全局变量,而且全局变量不必已经初始化。全局变量可以在任意一个函数内初始化。但是,一定注意,初始化时全局变量名前一定不能再加var关键字。(加了var的话,就定义了一个同名的局部变量,没有被初始化全局变量。这样的话,执行命名空间内的函数时全局变量是undefined.)