Bash

BASH 從十進製到十六進制的基本轉換

  • August 26, 2021

在 Bash 中,如何進行從十進製另一種基礎的基礎轉換,尤其是十六進制。走另一條路似乎很容易:

$ echo $((16#55))
85

通過網路搜尋,我找到了一個執行數學和字元操作來進行轉換的腳本,我可以將它用作一個函式,但我原以為 bash 已經有一個內置的基本轉換——可以?

使用bash(或任何 shell,只要printf命令可用(通常內置在 shell 中的標準 POSIX 命令)):

printf '%x\n' 85

有了zsh,您還可以做到:

dec=85
hex=$(([##16]dec))

這適用於從 2 到 36 的基數(0-9a-z數字不區分大小寫)。

$(([#16]dev))(只有一個#)擴展為16#550x55(作為基數 16 的特殊情況),如果啟用該選項(如果該cbases選項也啟用,也適用於基數 8(0125而不是8#125octalzeroes)。

使用ksh93,您可以使用:

dec=85
base54=${ printf %..54 "$dec"; }

它適用於從 2 到 64 的基數(與0-9a-zA-Z@_數字一樣)。

kshzsh,還有:

$ typeset -i34 x=123; echo "$x"
34#3l

雖然這僅限於 ksh88、zsh 和 pdksh 中最多 36 個基數以及 ksh93 中最多 64 個基數。

請注意,所有這些都僅限於long系統上整數的大小(int帶有某些外殼的 ’s )。對於更大的東西,您可以使用bcor dc

$ echo 'obase=16; 9999999999999999999999' | bc
21E19E0C9BAB23FFFFF
$ echo '16o 9999999999999999999999 p' | dc
21E19E0C9BAB23FFFFF

支持的基數範圍從 2 到 POSIX 要求的某個數字至少高達 99。對於大於 16 的基數,大於 9 的數字表示為空格分隔的 0 填充十進制數。

$ echo 'obase=30; 123456' | bc
04 17 05 06

或與dcbc曾經是(並且仍然在某些系統上)包裝器相同dc):

$ echo 30o123456p | dc
04 17 05 06

引用自:https://unix.stackexchange.com/questions/191205