在 UNIX shell 脚本中,我可以使用什么将十进制数转换为十六进制数?我以为 od 可以解决这个问题,但它没有意识到我正在向它提供数字的 ASCII 表示形式。
printf?总的!现在用它,但还有什么可用?
尝试过
printf(1)
吗?
printf "%x\n" 34
22
可能有一些方法可以使用所有 shell 中的内置函数来实现这一点,但它的可移植性较差。我还没有检查 POSIX sh 规范来看看它是否具有这样的功能。
echo "obase=16; 34" | bc
如果您想过滤整个整数文件,每行一个:
( echo "obase=16" ; cat file_of_integers ) | bc
十六进制转十进制:
$ echo $((0xfee10000))
4276158464
十进制转十六进制:
$ printf '%x\n' 26
1a
bash-4.2$ printf '%x\n' 4294967295
ffffffff
bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
对不起我的错,试试这个...
#!/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
尝试:
printf "%X\n" ${MY_NUMBER}
就我而言,我偶然发现了使用 printf 解决方案的一个问题:
$ printf "%x" 008
bash: printf: 008: invalid octal number
最简单的方法是使用 bc 的解决方案,在更高的帖子中建议:
$ bc <<< "obase=16; 008"
8
在
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
关于算术评估的文档页面。
我相信 Bash 也有类似的功能。
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
}
# 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
这不是 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);
}
对于那些想要使用变量的人,首先通过运行导出它:
export NUM=100
然后运行:
printf "%x\n" $NUM
否则,您可以忽略变量的用例并直接运行它,如下所示:
printf "%x\n" 100
注意:将 NUM 替换为您选择的变量名称。
导出使其成为环境变量(全局)。
哇,我没有意识到 printf 在 shell 中可用!
话虽如此,我很惊讶没有人评论将 printf 放入 shell 脚本中(如果需要,你可以将其放入你的个人 bin 目录中)。
回显“printf”0x%x “ $1” > 十六进制 chmod +x 十六进制
现在只需运行: ./十六进制 123
它返回: 0x7b