在 JavaScript 中將 ASCII 轉換為十六進位制

Nithin Krishnan 2023年10月12日
  1. 在 JavaScript 中將 ASCII 字元轉換為十六進位制
  2. 在 JavaScript 中將 ASCII 字串轉換為等效的十六進位制
  3. 將十六進位制轉換回 ASCII
在 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 的資料。因此,我們可以使用我們的程式碼轉換更長的字串值。