Как преобразовать строку Hex
в строку ASCII
в JavaScript?
Пример:
32343630 будет 2460
Как преобразовать строку Hex
в строку ASCII
в JavaScript?
Пример:
32343630 будет 2460
function hex2a(hexx) {
var hex = hexx.toString();//force conversion
var str = '';
for (var i = 0; (i < hex.length && hex.substr(i, 2) !== '00'); i += 2)
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
hex2a('32343630'); // returns '2460'
В целях полноты обратная функция:
function a2hex(str) {
var arr = [];
for (var i = 0, l = str.length; i < l; i ++) {
var hex = Number(str.charCodeAt(i)).toString(16);
arr.push(hex);
}
return arr.join('');
}
a2hex('2460'); //returns 32343630
Другой способ сделать это (если вы используете Node.js):
var input = '32343630';
var output = new Buffer(input, 'hex');
log(input + " -> " + output); // Result: 32343630 -> 2460
Вы можете использовать это.
var asciiVal = "32343630".match(/.{1,2}/g).map(function(v){
return String.fromCharCode(parseInt(v, 16));
}).join('');
document.write(asciiVal);
Я нашел полезную функцию в библиотеке web3.
var hexString = "0x1231ac"
string strValue = web3.toAscii(hexString)
Я обнаружил, что вышеупомянутое решение не будет работать, если вам придется иметь дело с управляющими символами, такими как 02
(STX) или 03
(ETX), все, что меньше 10
будет читаться как одна цифра и после этого будет сбрасывать все. Я столкнулся с этой проблемой, пытаясь разобрать через последовательную связь. Итак, я сначала взял полученную шестнадцатеричную строку и поместил ее в буферный объект, затем преобразовал шестнадцатеричную строку в массив строк следующим образом:
buf = Buffer.from(data, 'hex');
l = Buffer.byteLength(buf,'hex');
for (i=0; i<l; i++){
char = buf.toString('hex', i, i+1);
msgArray.push(char);
}
Тогда присоединяйтесь
message = msgArray.join('');
затем я создал функцию hexToAscii
как в ответе @Delan Azabani выше...
function hexToAscii(str){
hexString = str;
strOut = '';
for (x = 0; x < hexString.length; x += 2) {
strOut += String.fromCharCode(parseInt(hexString.substr(x, 2), 16));
}
return strOut;
}
затем вызвал функцию hexToAscii
для "сообщения"
message = hexToAscii(message);
Этот подход также позволил мне перебрать массив и разделить на разные части передачи, используя управляющие символы, чтобы я мог иметь дело только с той частью данных, которую я хотел. Надеюсь, это поможет кому-то еще!
Оптимизированная версия реализации функции реверса, предложенная @michieljoris (согласно комментариям @Beterraba и @Mala):
function a2hex(str) {
var hex = '';
for (var i = 0, l = str.length; i < l; i++) {
var hexx = Number(str.charCodeAt(i)).toString(16);
hex += (hexx.length > 1 && hexx || '0' + hexx);
}
return hex;
}
alert(a2hex('2460')); // display 32343630
console.log(
"68656c6c6f20776f726c6421".match(/.{1,2}/g).reduce((acc,char)=>acc+String.fromCharCode(parseInt(char, 16)),"")
)