unit8array转换为字符串

unit8array 格式是8字节无符号整数数组,如果把它转换为 string 类型呢?

  1. 如果不是 utf8 编码的话,可以用下面的方法:

    1
    2
    3
    function uint8arrToStr(uint8arr){
    return String.fromCharCode.apply(null, uint8arr)
    }
  2. 如果使用了 utf8 编码,在浏览器上可以用下面的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 把 Uint8Array 转换为 String
    function uint8arrToStr(uint8arr){
    return new TextDecoder("utf-8").decode(uint8arr)
    }

    // 把 String 转换为 Uint8Array
    function str2Uint8arr(str){
    return new TextEncoder("utf-8").encode(str)
    }
  3. 但是并非所有浏览器都支持 TextEncoder,跨平台的方法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function uint8arrToStr(array) {
    let out, i, len, c, char2, char3
    out = ""
    len = array.length
    i = 0
    while(i < len) {
    c = array[i++]
    switch(c >> 4) {
    case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
    // 0xxxxxxx
    out += String.fromCharCode(c)
    break
    case 12: case 13:
    // 110x xxxx 10xx xxxx
    char2 = array[i++]
    out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F))
    break
    case 14:
    // 1110 xxxx 10xx xxxx 10xx xxxx
    char2 = array[i++]
    char3 = array[i++]
    out += String.fromCharCode(((c & 0x0F) << 12) |
    ((char2 & 0x3F) << 6) |
    ((char3 & 0x3F) << 0))
    break
    }
    }
    return out
    }
  4. 如果数组非常大的话,可能耗时会比较久,更好的方式就是使用异步操作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function uint8arrToStr(uint8arr, callback) {
    const bb = new Blob([uint8arr])
    const f = new FileReader()
    f.onload = function(e) {
    callback(e.target.result);
    }
    f.readAsText(bb)
    }

    const myUint8arr = new Uint8Array([72, 101, 108, 108, 111, 32, 33])
    uint8arrToStr(myUint8arr,function(text){
    console.log(text);
    })