Bash
BASH 從十進製到十六進制的基本轉換
在 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#55
或0x55
(作為基數 16 的特殊情況),如果啟用該選項(如果該cbases
選項也啟用,也適用於基數 8(0125
而不是8#125
)octalzeroes
)。使用
ksh93
,您可以使用:dec=85 base54=${ printf %..54 "$dec"; }
它適用於從 2 到 64 的基數(與
0-9a-zA-Z@_
數字一樣)。有
ksh
和zsh
,還有:$ typeset -i34 x=123; echo "$x" 34#3l
雖然這僅限於 ksh88、zsh 和 pdksh 中最多 36 個基數以及 ksh93 中最多 64 個基數。
請注意,所有這些都僅限於
long
系統上整數的大小(int
帶有某些外殼的 ’s )。對於更大的東西,您可以使用bc
ordc
。$ 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
或與
dc
(bc
曾經是(並且仍然在某些系統上)包裝器相同dc
):$ echo 30o123456p | dc 04 17 05 06