目录
js中的二进制
ArrayBuffer Buffer TypedArray DataView Blob FileReader TextEncoder TextDecoder
-
浏览器环境下有的类:
除了 Buffer 浏览器下没有,其余都有 -
nodejs环境下有的类:
Buffer ArrayBuffer TypedArray
相似的地方:
ArrayBuffer 和 Buffer 的存储的结构基本一样,
不同的是 ArrayBuffer 需要使用 TypedArray 或者 DataView这样的东西去访问
Buffer 可以直接 read write.
需求1:
string 和 arraybuffer 之间相互转换.
方法1:
如果要使得生成 arraybuffer 转换成 Buffer后,直接使用 buffer.toString('utf8') 方法可以得到字符串,就使用 TextEncoder进行编码:
/**
* Convert String to ArrayBuffer via TextEncoder
*
* @see https://developer.mozilla.org/zh-CN/docs/Web/API/TextEncoder
* @input {string}
* @return {ArrayBuffer}
*/
function str2ab(input) {
const view = str2Uint8Array(input)
return view.buffer
}
/** Convert String to Uint8Array */
/**
* @param input {string}
* @return {Uint8Array}
*/
function str2Uint8Array(input){
const encoder = new TextEncoder()
const view = encoder.encode(input)
return view
}
/**
* Convert ArrayBuffer/TypedArray to String via TextDecoder
*
* @see https://developer.mozilla.org/en-US/docs/Web/API/TextDecoder
* @return {string}
*/
function ab2str(
input, //: ArrayBuffer | Uint8Array | Int8Array | Uint16Array | Int16Array | Uint32Array | Int32Array,
outputEncoding // : string = 'utf8',
) {
const decoder = new TextDecoder(outputEncoding)
return decoder.decode(input)
}
这样得到的二进制数据,在nodejs下使用Buffer的时候,可以直接得到字符串,对应的在客户端下,使用TextDecoder进行解码.
方法2:
把字符串的每个字符都用一个 Uint16Array去存储,获得响应的二进制数据.
解码的时候,也按照相对的方法解码即能得到二进制数据.
// ArrayBuffer转为字符串,参数为ArrayBuffer对象
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
// 字符串转为ArrayBuffer对象,参数为字符串
function str2ab(str) {
var buf = new ArrayBuffer(str.length * 2); // 每个字符占用2个字节
var bufView = new Uint16Array(buf);
for (var i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
// buffer 和 arraybuffer 之间的相互转换
function ab2b(ab){
let uint8Arr = new Uint8Array(ab);
let buf = Buffer.alloc(uint8Arr.length);
for(let i = 0,len = uint8Arr.length; i < len; ++i){
buf.writeUInt8(uint8Arr[i],i);
}
return buf;
}
function b2ab(buf){
let arrbuf = new ArrayBuffer(buf.length);
let uint8Arr = new Uint8Array(arrbuf);
for(let i = 0,len = buf.length; i < len; ++i){
uint8Arr[i] = buf.readUInt8(i);
}
return arrbuf;
}