Obtengo un valor hexadecimal de mi cadena que se ve así:
String has letters with diacritics: č,š,ř, ...El valor hexadecimal de esta cadena es:
0053007400720069006E006700200068006100730020006C0065007400740065007200730020007700690074006800200064006900610063007200690074006900630073003A0020010D002C00200161002C00200159002C0020002E002E002EEl problema es que cuando trato de volver a convertir este valor a ascii, convierte mal el č, š, ř, .. y devuelve el símbolo de una pequeña caja con un signo de interrogación en lugar de estos símbolos.
Mi código para convertir hexadecimal a ascii:
function convertHexadecimal(hexx){ let index = hexx.indexOf("~"); let strInfo = hexx.substring(0, index+1); let strMessage = hexx.substring(index+1); var hex = strMessage.toString(); var str = ''; for (var i = 0; i < hex.length; i += 2){ str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); } console.log("Zpráva: " + str); var strFinal = strInfo + str; return strFinal; }puede alguien ayudarme con esto?
Primero una solución de ejemplo:
let demoHex = `0053007400720069006E006700200068006100730020006C0065007400740065007200730020007700690074006800200064006900610063007200690074006900630073003A0020010D002C00200161002C00200159002C0020002E002E002E`; function hexToString(hex) { let str=""; for( var i = 0; i < hex.length; i +=4) { str += String.fromCharCode( Number("0x" + hex.substr(i,4))); } return str; } console.log("Decoded string: %s", hexToString(demoHex) );Qué está haciendo:
Trata los caracteres hexadecimales como una secuencia de 4 dígitos hexadecimales que proporcionan el código de carácter UTF-16 de un carácter.
Obtiene cada conjunto de 4 dígitos en un bucle usando String.prototype.substr . Tenga en cuenta que MDN dice que .substr está en desuso, pero esto no se menciona en el estándar ECMASript: reescríbalo para usar substring o cualquier otra cosa que desee.
Los caracteres hexadecimales tienen el prefijo "0x" para convertirlos en una representación numérica válida en JavaScript y convertirlos en un objeto numérico mediante Number . Luego, el número se convierte en una cadena de caracteres mediante el método estático String.fromCharCode .
Supuse el formato de la cadena hexadecimal mirándola, lo que significa que una rutina de codificación de propósito general para codificar caracteres UTF16 (no puntos de código) en hexadecimal podría verse así:
const hexEncodeUTF16 = str=>str.split('') .map( char => char.charCodeAt(0).toString(16).padStart(4,'0')) .join(''); console.log( hexEncodeUTF16( "String has letters with diacritics: č, š, ř, ..."));Espero que estos ejemplos muestren lo que se necesita hacer: hay varias formas de implementarlo en el código.