Як конвертувати з Hex в ASCII в JavaScript?


78

Як перетворити з Hexрядка в ASCIIрядок у JavaScript?

Приклад:

32343630 це буде 2460


7
Я впевнений, що для цього існує плагін jQuery ^^
AndiDog

2
jQuery в першу чергу призначений для маніпулювання DOM і, в меншій мірі, для реалізації таких речей, як Array.prototype.{map,forEach}()застарілі / обмежені браузери. Чесно кажучи, це здається більше схожим на сферу Underscore.js .
Чіното Вокро

1
@AndiDog Не корисно для тих з нас, хто використовує node
Адам Ф,

Відповіді:


158
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'

2
Це не працює. console.log(hex2a('32343630') === hex2a('3234363000')); // returns 'true'!!!.
steinybot

3
Ця відповідь є неправильним з - за: && hex.substr(i, 2) !== '00'. Як зауважив @steinybot, це переривається на першому, 0а отже, не повністю перетворює шістнадцятковий формат у рядок. Правильним рішенням є: function hex2a(hexx) { var hex = hexx.toString();//force conversion var str = ''; for (var i = 0; i < hex.length; i += 2) str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); return str; }
Марк Векерлін

Історія редагувань показує, що NULдефект був доданий спеціально. Цю відповідь пошкоджено.
Дон Круїкшенк,

36

Для повноти функція зворотного:

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

3
Примітка щодо цієї реалізації: ви повинні вручну вставити "0", коли hexзначення знаходиться між 0x0 і 0x9. Для цього я міняю вашу arr.push(hex)на arr.push(hex.length > 1 && hex || "0" + hex);.
Бетерраба

Конкатенація рядків насправді швидша, ніж побудова масивів рядків та приєднання до них у javascript
Мала,

1
У вас помилка, ви забули поставити закриваючу дужку після toString(16)(рядок № 4). ;-)
Арджун

29

Інший спосіб зробити це (якщо ви використовуєте Node.js):

var input  = '32343630';
const output = Buffer.from(input, 'hex');
log(input + " -> " + output);  // Result: 32343630 -> 2460

1
Найкраще рішення! Використання власних функцій. Це має бути прийнятою відповіддю!
Milkncookiez

щоб потім перетворити outputна ASCII, використовуйтеoutput.toString()
rmanna

new Buffer(input,"hex").toString()видає оригінальний рядок
malik bagwala


8

Я знайшов корисну функцію, присутню в бібліотеці web3 .

var hexString = "0x1231ac"
string strValue = web3.toAscii(hexString)

4

** для Hexa в рядок **

let input  = '32343630';

Примітка: нехай output = новий буфер (вхід, 'hex'); // це застаріло

let buf = Buffer.from(input, "hex");
let data = buf.toString("utf8");

3
Не впевнений, чому це було проголосовано, мені здається, це найкраща відповідь зараз для nodejs в 2020 році
Паскаль Бейонкле

@PascalBelloncle Я згоден, що це найкраща відповідь для Node.js, але проблема полягає в тому, Bufferщо не існує в звичайному JavaScript. Я сподіваюся, що голосування проти було тому, що питання позначене JavaScript, а не Node.js.
Дон Круїкшенк,

3

Я виявив, що вищезазначене рішення не буде працювати, якщо вам доведеться мати справу з контрольними символами, такими як 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);

Цей підхід також дозволив мені перебирати масив і нарізати різні частини передачі, використовуючи контрольні символи, щоб я міг мати справу лише з тією частиною даних, яку хотів. Сподіваюся, це допомагає комусь іншому!



0

Оптимізована версія реалізації зворотної функції, запропонована @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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.