Answers:
使用bash
(或任何shell,只要该printf
命令可用(通常内置在shell中的标准POSIX命令)):
printf '%x\n' 85
有了zsh
,您还可以执行以下操作:
dec=85
hex=$(([##16]dec))
适用于2到36之间的基数(0-9a-z
数字不区分大小写)。
使用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
带有某些shell的)。对于更大的东西,可以使用bc
或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
或与dc
(bc
过去(在某些系统上仍然是)包装器dc
)相同:
$ echo 30o123456p | dc
04 17 05 06
#
?
bash
内建函数,您可以以任何基数输入数字,但不能以8、10和16以外的任何基数输出数字。对于其他基数,则需要另一个shell,例如zsh
or ksh
或use bc/dc
。
alias hex="printf '%x\n'"
使用printf:
$ printf "%d %x\n" $((16#55)) $((10#85))
85 55
要将值分配给变量,请使用命令替换:
$ x=$( printf "%x" 85 ) ; echo $x
55
-v
内置printf 的选项:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
这里不需要使用非标准选项(例如);我会避免的。
-v
将避免使用分叉和管道(在bash中,而不是在ksh93中,它不会像printf
内置的那样在此处分叉)。请注意,这$((16#55))
也不是标准的。
x=$(some_builtin)
吗?
使用所有POSIX兼容外壳程序中都存在的内置算术扩展替换-目前这已经很普遍了。
$ echo $((0xbc))
188
和
$ hex=dead
$ dec=$((0x$hex))
$ echo $dec
57005
注意:特别是在最后一个示例中,扩展可能会导致意外的结果-变量'hex'中的十六进制数字必须形成合法的十六进制常量,否则可能会产生难以理解的错误消息。例如,如果'hex'为'0xdead',则算术扩展将变为0x0xdead,这不能解释为常量。当然,在那种情况下,算术扩展$(($ hex))可以解决问题。留给读者的练习是创建简单的子字符串处理模式匹配,该模式将删除可选的“ 0x”前缀。