Как получить правильные значения при преобразовании шестнадцатеричного символа в символ ascii - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь преобразовать hexa-файл в текст, используя javascript-узел js.

function hex_to_ascii(str1){
    var hex  = str1.toString();
    var str = '';
    for (var n = 0; n < hex.length; n += 2) {
        str += String.fromCharCode(parseInt(hex.substr(n, 2), 16));
    }
    return str;
}

У меня проблема с расширением символов ASCII, например, когда я пытаюсь преобразовать 93 I 'я получаю «вместо» и когда я конвертирую FF, я получаю «вместо» (nbsp) пробела.

Я хочу получить те же расширенные символы, что и в этой таблице: https://www.rapidtables.com/code/text/ascii-table.html

1 Ответ

0 голосов
/ 21 октября 2019

Эта проблема немного сложнее, чем кажется на первый взгляд, так как вам нужно указать кодировку при преобразовании из расширенного ascii в строку. Например, Windows-1252, ISO-8859-1 и т. Д. Поскольку вы хотите использовать связанную таблицу, я предполагаю, что вы хотите использовать кодирование CP437 .

Чтобы преобразовать буфер в строку, вам нужен модуль, который сделает это за вас, преобразование из буфера (в заданной кодировке) в строку не тривиально, если буфер не находится в изначально поддерживаемой кодировке node.js. например, UTF-8, ASCII (только 7-битный!), Latin1 и т. д.

Я бы предложил использовать пакет iconv-lite , это преобразует многие типы кодирования. После того, как это установлено, код должен выглядеть следующим образом (каждый символ принимает значение от 0x00 до 0xFF и печатает закодированный символ):

const iconv = require('iconv-lite');

function hex_to_ascii(hexData, encoding) {
    const buffer = Buffer.from(hexData, "hex");
    return iconv.decode(buffer, encoding);
}

const testInputs = [...Array(256).keys()];
const encoding = "CP437";
console.log("Decimal\tHex\tCharacter")
for(let input of testInputs) {
    console.log([input, input.toString(16), hex_to_ascii(input.toString(16), encoding)].join("\t"));
}
...