首页 > 解决方案 > 当我将十六进制转换为 ascii 字符时如何获得正确的值

问题描述

我正在尝试使用 javascript 节点 js 将 hexa 文件转换为文本。

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 时,我得到 “ 而不是 ô,当我转换 FF 时,我得到 ÿ 而不是 (nbsp) 空格。

我想获得与此表相同的扩展字符:https ://www.rapidtables.com/code/text/ascii-table.html

标签: node.jshexasciinon-ascii-charactersextended-ascii

解决方案


这个问题比最初看起来要复杂一些,因为在从扩展 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"));
}

推荐阅读