es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Conversión de una cadena ASCII/Base64 a hexadecimal en JavaScript

Mis datos de entrada son una matriz de valores ASCII:

[103, 81, 70, 72, 65, 65, 111, 66, 71, 65, 77, 69, 67, 81, 73, 65, 65, 78, 67, 117]

Cada elemento de la matriz anterior es el valor ASCII de la cadena Base64: "gQFHAAoBGAMECQIAANCu"

Quiero convertir esta cadena Base64 a bytes hexadecimales como: 81 01 0f 00 0a 01 18 03 04 09 03 00 00 81 6e

Mi enfoque hasta ahora:

function Decode(bytes) {
  var base64String = b2s(bytes);
  var HexValue = toHex(base64String);
  return HexValue;
}

function b2s(array) {
  return String.fromCharCode.apply(String, array);
}

function toHex(str) {
  var result = '';
  for (var i = 0; i < str.length; i++) {
    result += str.charCodeAt(i).toString(16);
  }
  return result;
}

const data = Decode([103, 81, 70, 72, 65, 65, 111, 66, 71, 65, 77, 69, 67, 81, 73, 65, 65, 78, 67, 117])
console.log(data);

El fragmento de código anterior me da como resultado: "6751464841416f4247414d4543514941414e4375", que es una cadena hexadecimal. Encontré algunas preguntas en StackOverflow que sugieren el siguiente fragmento de código:

function base64ToHex(str) {
  const raw = atob(str);
  let result = '';
  for (let i = 0; i < raw.length; i++) {
    const hex = raw.charCodeAt(i).toString(16);
    result += (hex.length === 2 ? hex : '0' + hex);
  }
  return result.toUpperCase();
}

Sin embargo, la función atob no está disponible en mi implementación.

¿Me he olvidado algo en mi enfoque? Cualquier ayuda será muy apreciada. Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que tu enfoque actual consiste en convertir la cadena Base64 a una cadena Hexadecimal, pero no del todo en el formato correcto. Un problema puede ser que necesitas agregar relleno a la cadena Base64 antes de convertirla a Hexadecimal, ya que la cadena Base64 original tiene algunos caracteres de relleno al final (signos de igual).

    Para convertir de Base64 a Hexadecimal sin utilizar atob, puedes utilizar una biblioteca como js-base64, que proporciona un objeto Base64 con métodos de codificación y decodificación. Aquí tienes un fragmento de código actualizado que utiliza js-base64:

    const Base64 = require('js-base64').Base64;
    
    function base64ToHex(str) {
      const hex = [];
      const base64 = Base64.fromBase64(str.padEnd((str.length + 3) & ~3, '='));
      for (let i = 0; i < base64.length; i++) {
        hex.push(('00' + base64.charCodeAt(i).toString(16)).slice(-2));
      }
      return hex.join(' ').toUpperCase();
    }
    
    const data = base64ToHex('gQFHAAoBGAMECQIAANCu');
    console.log(data); // "81 01 0F 00 0A 01 18 03 04 09 03 00 00 81 6E"
    

    En este enfoque actualizado, primero agregamos signos de igual a la cadena Base64 para asegurarnos de que su longitud sea un múltiplo de 4. Luego, utilizamos Base64.fromBase64 para convertirla en una cadena regular y recorremos cada carácter para convertirlo en una cadena Hexadecimal. Agregamos una llamada slice(-2) para asegurarnos siempre obtener 2 caracteres, incluso para valores menores a 16.

    ¡Espero que esto te ayude!

Comments are closed.