Aprende varias formas de convertir un Uint8Array en cadena en Javascript.

Al trabajar con node.js u otras plataformas javascript (multioperabilidad), encontrará que algunos métodos deciden devolver algo diferente a una cadena. Un Uint8Array es una matriz con tipo que representa una matriz de enteros sin signo de 8 bits.

La siguiente lista de métodos proporciona una colección de formas eficientes de convertir un Uint8Array en una cadena normal en javascript.

Pequeñas cuerdas

El siguiente método es aceptable para arreglos pequeños (> = 100k caracteres); de lo contrario, obtendrá excepciones como RangeError : Maximum call stack size exceededOut of stack space. Sin embargo, debe saber que este método no funciona bien con caracteres UTF-8.

function uint8arrayToStringMethod(myUint8Arr){
   return String.fromCharCode.apply(null, myUint8Arr);
}

Implementación del navegador

Si su javascript se está ejecutando en un navegador, puede hacer uso de las funciones nativas TextEncoderTextDecoderque le permiten elegir qué codificación desea usar. La API de codificación ayuda a resolver el problema de conversión de cadenas.

/**
 * Convierta un Uint8Array en una cadena.
 *
 * @returns {String}
 */
function Decodeuint8arr(uint8array){
    return new TextDecoder("utf-8").decode(uint8array);
}

/**
 * Convierta una cadena en un Uint8Array.
 *
 * @returns {Uint8Array}
 */
function Encodeuint8arr(myString){
    return new TextEncoder("utf-8").encode(myString);
}

Método multiplataforma

El siguiente método es muy útil y funciona bastante bien. No utiliza ningún truco ni depende de las funciones del navegador JS, por ejemplo, funciona también en otros entornos JS. Funciona mediante la convención UTF-8.

// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt

/* utf.js - UTF-8 <=> UTF-16 convertion
 *
 * Copyright (C) 1999 Masanao Izumo <[email protected]>
 * Version: 1.0
 * LastModified: Dec 25 1999
 * Esta biblioteca es gratuita. Puedes redistribuirlo y / o modificarlo.
 */

function Utf8ArrayToStr(array) {
    var out, i, len, c;
    var 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;
}

Grandes bloques

Si su bloque de datos es enorme, es posible que desee utilizar un método que funcione correctamente con datos grandes (un método asíncrono). En este caso, crearemos un blob que contenga nuestro Uint8Array y luego usaremos el lector de archivos para leerlo como texto.

/**
 * Convierte un búfer de matriz en una cadena
 *
 * @param {Uin8} uint8arr | El búfer para convertir
 * @param {Function} callback | La función a llamar cuando se completa la conversión
 */
function largeuint8ArrToString(uint8arr, callback) {
    var bb = new Blob([uint8arr]);
    var f = new FileReader();
    f.onload = function(e) {
        callback(e.target.result);
    };
    
    f.readAsText(bb);
}

// Ejemplo de uso
// "Hello" in Uint8Array format
var myuint8Arr = new Uint8Array([72, 101, 108, 108, 111, 32, 33]);

largeuint8ArrToString(myuint8Arr,function(text){
    // Hello
    console.log(text);
});

Nota: como se dijo antes, este método es recomendable solo si maneja grandes conjuntos de datos.

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores