在UNIX shell脚本中,我可以使用什么来将十进制数转换为十六进制?我认为od可以解决这个问题,但它没有意识到我正在为它提供数字的ASCII表示。
的printf?毛!现在使用它,但还有什么可用?
答案 0 :(得分:170)
尝试printf(1)
?
printf "%x\n" 34
22
有可能在所有shell中使用内置函数来实现这一点,但它的可移植性会降低。我没有检查POSIX sh规范,看看它是否具有这样的功能。
答案 1 :(得分:99)
echo "obase=16; 34" | bc
如果要过滤整个整数文件,每行一个:
( echo "obase=16" ; cat file_of_integers ) | bc
答案 2 :(得分:63)
十六进制到十进制:
$ echo $((0xfee10000))
4276158464
十进制到十六进制:
$ printf '%x\n' 26
1a
答案 3 :(得分:15)
bash-4.2$ printf '%x\n' 4294967295
ffffffff
bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
答案 4 :(得分:4)
对不起我的错,试试这个......
#!/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
答案 5 :(得分:3)
在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
docs page about Arithmetic Evaluation。
我相信Bash有类似的能力。
答案 6 :(得分:2)
尝试:
printf "%X\n" ${MY_NUMBER}
答案 7 :(得分:1)
# 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
答案 8 :(得分:1)
就我而言,我偶然发现了使用printf解决方案的一个问题:
publickey
最简单的方法是使用 bc 的解决方案,建议更高的帖子:
$ printf "%x" 008
bash: printf: 008: invalid octal number
答案 9 :(得分:0)
这不是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);
}
答案 10 :(得分:0)
xd() {
echo "$(( 0x${1} ))"
}
dx() {
printf '%x\n' $1
}
答案 11 :(得分:-2)
哇,我没想到在 shell 中可以使用 printf!
话虽如此,我很惊讶没有人评论将 printf 放入 shell 脚本(如果需要,然后您可以将其放入您的个人 bin 目录)。
echo "printf "0x%x\n" $1" > 十六进制 chmod +x 十六进制
现在只需运行: ./十六进制 123
它返回: 0x7b