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 exceeded
o Out 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 TextEncoder
y TextDecoder
que 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 ❤️!
Conviertete en un programador más sociable