ArrayBuffer
只能访问,动不了,只能通过 TypedArray、DataView 这些中间仔动他。
TypedArray
典型的,Uint8Array,其他的搜一搜,不再赘述。
特别注意,Node 端的Buffer,其实际约等于 Uint8Array,相当于也是 TypedArray 的一种
各种转换
string / base64 转换
- btoa 将 string 转成 base-64 编码的 ASCII 字符串
- atob 将 base-64 编码的 ASCII 字符串 转成 string
参考:MDN btoa
坑点:部分字符(Unicode字符)无法通过 btoa 转换,需要中间先进行一层转换。参考:Unicode 字符串
ArrayBuffer / string 转换
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
参考来源:How to convert ArrayBuffer to and from String
Uint8Array / string 转换
var uint8array = new TextEncoder().encode(string);
// encoding default 'utf-8' or 'utf8'
// 更多请见 https://developer.mozilla.org/zh-CN/docs/Web/API/TextDecoder
var string = new TextDecoder(encoding).decode(uint8array)
Uint8Array / hex 转换
const uint8ArrayToHex = (uint8Array) => {
return [...uint8Array].map((b) => {
return b.toString(16).padStart(2, '0')
}).join('')
}
ArrayBuffer / TypedArray
const uint8ArrayToArrayBuffer = (uint8Array) => {
return uint8Array.buffer
}
const arrayBufferToUint8Array = (ab) => {
return new Uint8Array(ab)
}
Node Buffer / Uint8Array
// N年前版本
const bufToArrayBuffer = (buf) => {
var arrayCopy = new Uint8Array(buf.length)
var len = buf.length
for (var i = 0; i < len; i++) {
arrayCopy[i] = buf[i]
}
return arrayCopy.buffer
}
// 简单写法
const bufToArrayBuffer = (buf) => {
return buf.buffer
}
const arrayBufferToBuf = (ab) => {
return Buffer.from(ab)
}
参考来源: