在 UNIXshell 脚本中将十进制转换为十六进制

在 UNIXshell 脚本中,我可以使用什么来将十进制数转换为十六进制数?我以为 od 可以解决这个问题,但是它没有意识到,我给它输入的是数字的 ASCII 表示。

Printf? 太恶心了! 目前正在使用它,但是还有什么可用的?

223977 次浏览

Tried printf(1)?

printf "%x\n" 34
22

对于所有 shell 中的内置函数,可能有一些方法可以做到这一点,但是它的可移植性较差。我还没有检查 POSIX sh 规范来查看它是否具有这样的功能。

试试:

printf "%X\n" ${MY_NUMBER}
echo "obase=16; 34" | bc

如果要过滤整个整数文件,每行一个:

( echo "obase=16" ; cat file_of_integers ) | bc

zsh中你可以这样做:

% typeset -i 16 y
% print $(( [#8] x = 32, y = 32 ))
8#40
% print $x $y
8#40 16#20
% setopt c_bases
% print $y
0x20

取自 关于算术评估的 zsh文档页面的例子。

我相信巴斯也有类似的能力。

十六进制到十进制:

$ echo $((0xfee10000))
4276158464

Decimal to hexadecimal:

$ printf '%x\n' 26
1a

对不起,我的错,试试这个..。

#!/bin/bash
:


declare -r HEX_DIGITS="0123456789ABCDEF"


dec_value=$1
hex_value=""


until [ $dec_value == 0 ]; do


rem_value=$((dec_value % 16))
dec_value=$((dec_value / 16))


hex_digit=${HEX_DIGITS:$rem_value:1}


hex_value="${hex_digit}${hex_value}"


done


echo -e "${hex_value}"

例如:

$ ./dtoh 1024
400
bash-4.2$ printf '%x\n' 4294967295
ffffffff


bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
# number conversion.


while `test $ans='y'`
do
echo "Menu"
echo "1.Decimal to Hexadecimal"
echo "2.Decimal to Octal"
echo "3.Hexadecimal to Binary"
echo "4.Octal to Binary"
echo "5.Hexadecimal to  Octal"
echo "6.Octal to Hexadecimal"
echo "7.Exit"


read choice
case $choice in


1) echo "Enter the decimal no."
read n
hex=`echo "ibase=10;obase=16;$n"|bc`
echo "The hexadecimal no. is $hex"
;;


2) echo "Enter the decimal no."
read n
oct=`echo "ibase=10;obase=8;$n"|bc`
echo "The octal no. is $oct"
;;


3) echo "Enter the hexadecimal no."
read n
binary=`echo "ibase=16;obase=2;$n"|bc`
echo "The binary no. is $binary"
;;


4) echo "Enter the octal no."
read n
binary=`echo "ibase=8;obase=2;$n"|bc`
echo "The binary no. is $binary"
;;


5) echo "Enter the hexadecimal no."
read n
oct=`echo "ibase=16;obase=8;$n"|bc`
echo "The octal no. is $oct"
;;


6) echo "Enter the octal no."
read n
hex=`echo "ibase=8;obase=16;$n"|bc`
echo "The hexadecimal no. is $hex"
;;


7) exit
;;
*) echo "invalid no."
;;


esac
done

In my case, I stumbled upon one issue with using printf solution:

$printf“% x”008 bash: printf: 008: invalid octal number

最简单的方法是使用解决方案与 公元前,建议在后高:

$bc < < < “ obase = 16; 008” 8

这不是一个 shell 脚本,但它是我用来在 bin/oct/dec/hex 之间转换数字的 cli 工具:

    #!/usr/bin/perl


if (@ARGV < 2) {
printf("Convert numbers among bin/oct/dec/hex\n");
printf("\nUsage: base b/o/d/x num num2 ... \n");
exit;
}


for ($i=1; $i<@ARGV; $i++) {
if ($ARGV[0] eq "b") {
$num = oct("0b$ARGV[$i]");
} elsif ($ARGV[0] eq "o") {
$num = oct($ARGV[$i]);
} elsif ($ARGV[0] eq "d") {
$num = $ARGV[$i];
} elsif ($ARGV[0] eq "h") {
$num = hex($ARGV[$i]);
} else {
printf("Usage: base b/o/d/x num num2 ... \n");
exit;
}
printf("0x%x = 0d%d = 0%o = 0b%b\n", $num, $num, $num, $num);
}
xd() {
printf "hex> "
while read i
do
printf "dec  $(( 0x${i} ))\n\nhex> "
done
}
dx() {
printf "dec> "
while read i
do
printf 'hex  %x\n\ndec> ' $i
done
}

哇,我还不知道 printf 在 shell 中是可用的!

说到这里,我很惊讶没有人评论将 printf 放入 shell 脚本(如果需要的话,您可以将其放入您的个人 bin 目录中)。

回显“ printf“0x% x n”$1”> 十六进制 Chmod + x 十六进制

现在快跑: ./十六进制123

它返回: 0x7b

对于那些希望使用变量的用户,首先通过运行:

export NUM=100

然后跑:

printf "%x\n" $NUM

否则,您可以忽略变量的用例,直接运行它,如下所示:

printf "%x\n" 100

注意: 用您选择的变量名替换 NUM。

出口使其成为一个环境变量(全球)。