Solución:
Falta el relleno en la conversión hexadecimal. Querrás usar
function toHexString(byteArray) {
return Array.from(byteArray, function(byte) {
return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join('')
}
de modo que cada byte se transforme en exactamente dos dígitos hexadecimales. Su salida esperada sería 04812d7e3a9829e5d51bdd64ceb35df060699bc1309731bd6e6f1a5443a7f9ce0af4382fcfd6f5f8a08bb2619709c2d49fb771601770f2c267985af2754e1f8cf9
Utilizando map()
no funcionará si la entrada es de un tipo como Uint8Array
: el resultado de map()
es también Uint8Array
que no puede contener los resultados de la conversión de cadenas.
function toHexString(byteArray) {
var s="0x";
byteArray.forEach(function(byte) {
s += ('0' + (byte & 0xFF).toString(16)).slice(-2);
});
return s;
}
Una alternativa más concisa y eficaz (consulte https://jsperf.com/byte-array-to-hex-string) usando Array.reduce ():
function toHexString(byteArray) {
return byteArray.reduce((output, elem) =>
(output + ('0' + elem.toString(16)).slice(-2)),
'');
}
(También sin “& 0xFF” porque, en mi opinión, si se pasa una matriz que contiene valores mayores que 255, la salida debe estar desordenada, para que el usuario pueda ver más fácilmente que su entrada fue incorrecta).