在 JavaScript 中将 ASCII 转换为十六进制
制定美国信息交换标准代码 (ASCII) 的主要目的是在设备之间交换数据。ASCII 是具有人类可读字符的代码表,它由映射到特定数字的每个字符(所谓的 ASCII 代码)组成。与计算机使用的二进制基数系统一样,我们在通过通道传输数据时使用十六进制数系统以实现无差错通信。ASCII 是一种人类可读的格式,计算机内部使用的格式不同。让我们看看如何使用 JavaScript 将 ASCII 值转换为十六进制值。
在 JavaScript 中将 ASCII 字符转换为十六进制
转换很容易,不需要代码中的很多步骤。让我们看看将 ASCII 字符转换为十六进制的代码。
window.onload = function () {
convertASCIItoHex("A");
convertASCIItoHex("n");
convertASCIItoHex("!");
}
function convertASCIItoHex(asciiVal) {
let asciiCode = asciiVal.charCodeAt(0);
let hexValue = asciiCode.toString(16);
console.log("0x" + hexValue);
}
输出:
0x41
0x6e
0x21
在本节中,我们将处理将 ASCII 字符转换为其等效的十六进制字符。我们将转换过程解释如下。
-
在 javascript 的
window.onload()
函数中,我们调用convertASCIItoHex()
函数将 ASCII 值转换为 javascript 中的十六进制值。window.onload()
函数在页面加载时调用,以便在页面加载后立即执行该函数。 -
在
convertASCIItoHex()
函数中,我们传递需要转换的 ASCII 值。asciiVal.charCodeAt(0)
返回在convertASCIItoHex()
函数中作为参数传递的输入值的 ASCII 码。ASCII 表包含到人类可读字母格式的映射以及与它们相关联的代码。它看起来像下面这样。十进制 十六进制代码 象征 描述 65 41 一种 大写 A 66 42 乙 大写 B 67 43 C 大写 C 68 44 D 大写 D 69 45 乙 大写 E 70 46 F 大写 F 71 47 G 大写 G 72 48 H 大写 H 73 49 一世 大写 I 74 4A J 大写 J 十进制列表示 ASCII 值的代码。例如, A
的 ASCII 码是 65。函数asciiVal.charCodeAt(0)
返回asciiVal
的 ASCII 值,该值持有值A
。因此它返回 65。我们将 ASCII 代码存储在asciiCode
变量中。 -
一旦我们得到参数值对应的 ASCII 码,我们下一步就是将其转换为十六进制。在片段
asciiCode.toString(16)
中,.toString(16)
函数将十六进制值作为字符串返回。我们将十六进制字符串值存储在hexValue
变量中。 -
在最后一步,我们使用 JavaScript 的
console.log()
函数对传递的属性的十六进制等效项进行控制台。
笔记
-
将
0x
关键字附加到转换后的十六进制值可能看起来很奇怪。javascript 中常用的方法是将数字标识为十六进制值(有关更多详细信息,请参阅 MSDN 文档)。为了你的业务目的,我们可以避免它并遵循.toString(16)
函数输出的十六进制值。 -
toString(16)
函数是 JavaScript 中的多用途函数。我们可以用它来转换为不同的数基系统。我们需要将十进制基数或基数作为参数传递给函数。如果我们期待 ASCII 代码的二进制等价物,那么toString(2)
函数将返回十进制值的二进制等价物。在返回二进制值之前,该函数会将对象类型转换为字符串。因此,.toString()
的返回类型是字符串。 -
上面的代码只考虑了一种字符转换。因此,如果你提供一个字符串作为输入,例如
convertASCIItoHex("HELLO")
,该函数将返回第一个字母H
的十六进制值。它由asciiVal.charCodeAt(0)
中的函数charCode(0)
完成。
在 JavaScript 中将 ASCII 字符串转换为等效的十六进制
我们生活中比较常见的需求是将一个字符串作为一个整体转换成十六进制的等价值而不是一个字符。以下程序将一个字符串作为输入,并为每个字符返回一个等效的十六进制字符串作为输出。每个十六进制值将由 ' '
分隔,以便更好地阅读和理解。
window.onload = function () {
convertASCIItoHex("Hello!");
convertASCIItoHex("Good Morning World!!");
}
function convertASCIItoHex(asciiString) {
let hex = '';
let tempASCII, tempHex;
asciiString.split('').map( i => {
tempASCII = i.charCodeAt(0)
tempHex = tempASCII.toString(16);
hex = hex + tempHex + ' ';
});
hex = hex.trim();
console.log(hex);
}
输出:
48 65 6c 6c 6f 21
47 6f 6f 64 20 4d 6f 72 6e 69 6e 67 20 57 6f 72 6c 64 21 21
这里 convertASCIItoHex()
返回与提供的字符串输入相对应的十六进制字符串值。它将返回一个 String
类型的值。为了可读性和清晰度,十六进制代码字符串用空格分隔。让我们看看我们遵循的步骤。
-
如上一节所述,我们调用 javascript 的
window.onload()
函数,然后通过传递字符串"Hello!"
调用convertASCIItoHex("Hello!")
函数作为它的参数。 -
在
convertASCIItoHex()
函数中,我们将输入字符串拆分为字符,以便于处理它们。因此,在这个阶段,"Hello!"
字符串转换为["H", "e", "l", "l", "o", "!"]
,一个字符串数组。 -
接下来,我们使用 javascript 的
.map()
运算符对数组的每个元素应用ASCII 到十六进制转换
。它遍历每个元素并在每个元素上执行一个函数。我们将函数作为内联函数或箭头函数传递。 -
在函数中,我们使用
charCodeAt(0)
来获取当前数组元素的 ASCII 码。然后,在 ASCII 代码对象上,我们应用toString(16)
将 ASCII 值转换为十六进制基数。然后我们将十六进制值推送到hex
数组,即输出数组。请注意,为了便于阅读,我们在连续转换之间使用了空格。你可能更喜欢使用,
或;
业务需要的分隔符。 -
使用
hex = hex + tempHex + ' '
我们在每个元素转换后附加一个空格。因此,最终结果将有一个尾随空格。为了删除它,我们使用了 javascript 的.trim()
函数。 -
最后,转换后的字符串数组通过
console.log(hex)
记录到控制台。
将十六进制转换回 ASCII
现在,当我们准备好十六进制值时,出现的问题是我们如何确认输出是否符合预期。我们使用 javascript 的 fromCharCode(ASCIICode)
函数实现了该功能的核心,该函数返回与传入参数的 ASCII 代码对应的 ASCII 字符。在这里,我们可以使用以下代码。
window.onload = function () {
convertASCIItoHex("48 65 6c 6c 6f 21");
convertASCIItoHex("47 6f 6f 64 20 4d 6f 72 6e 69 6e 67 20 57 6f 72 6c 64 21 21");
}
function convertHexToASCII(hexString) {
let stringOut = '';
hexString.split(' ').map( (i) => {
tempAsciiCode = parseInt(i, 16);
stringOut = stringOut + String.fromCharCode(tempAsciiCode);
});
console.log(stringOut);
}
输出:
Hello!
Good Morning World!!
一些方法在这里发挥了作用。parseInt(i, 16)
将基数 16
的输入转换为十进制基数。因此,使用这种方法,我们可以获得十六进制值的 ASCII 代码。而 String.fromCharCode(tempAsciiCode)
将作为参数传递给该函数的 ASCII 代码,并返回与该代码对应的 ASCII 字符。
评论
- 最常用的人类可读形式的 ASCII 包括字母、数字和特殊字符。使用 javascript 代码,我们打算涵盖这些字符集。我们无法在 JavaScript 中测试某些 ASCII 代码,例如 ACK:确认字符、ETX:文本结束字符等。
- 根据 ES8 标准,JavaScript 字符串变量最多可以容纳 253-1 个字符。这相当于 Chrome 中大约 512MB 的数据和 Firefox 中大约 1GB 的数据。因此,我们可以使用我们的代码转换更长的字符串值。