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

时间:2008-12-18 19:00:50

标签: unix shell hex

在UNIX shell脚本中,我可以使用什么来将十进制数转换为十六进制?我认为od可以解决这个问题,但它没有意识到我正在为它提供数字的ASCII表示。

的printf?毛!现在使用它,但还有什么可用?

12 个答案:

答案 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