• 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 略

  • 相关阅读:
    记录上锁(字节范围锁,特例:锁住文件的某一部分或者整个文件)
    读写锁的实现原理(pthread_rwlock_t)
    Linux 互斥锁的实现原理(pthread_mutex_t)
    System V消息队列
    Web安全之SQL注入攻击技巧与防范
    如何正确地写出单例模式
    java的concurrent用法详解
    java并发编程-Executor框架
    java.util.concurrent包分类结构图
    Java多线程干货系列(1):Java多线程基础
  • 原文地址:https://www.cnblogs.com/daihanlong/p/13580402.html
Copyright © 2020-2023  润新知