js 二进制

js中的二进制

ArrayBuffer Buffer TypedArray DataView Blob FileReader TextEncoder TextDecoder

  1. 浏览器环境下有的类:
    除了 Buffer 浏览器下没有,其余都有

  2. 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;
}

FileReader Blob 略

原文地址:https://www.cnblogs.com/daihanlong/p/13580402.html