在 UNIX shell 脚本中,我可以使用什么将十进制数字转换为十六进制?我认为 od 可以解决问题,但它没有意识到我正在向它提供数字的 ASCII 表示形式。
打印?总的!现在使用它,但还有什么可用的?
试过了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}
在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 也有类似的能力。
就我而言,我偶然发现了一个使用 printf 解决方案的问题:
$ printf "%x" 008
bash: printf: 008: invalid octal number
最简单的方法是使用带有bc的解决方案,在更高的帖子中建议:
$ bc <<< "obase=16; 008"
8
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);
}
哇,我没有意识到 shell 可以使用 printf !
话虽如此,我很惊讶没有人评论将 printf 放入 shell 脚本(如果需要,您可以将其放入您的个人 bin 目录中)。
echo "printf "0x%x\n" $1" > 十六进制 chmod +x 十六进制
现在只需运行:./hex 123
它返回:0x7b