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

问题描述 投票:0回答:13

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

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

unix shell hex
13个回答
215
投票

尝试过

printf(1)
吗?

printf "%x\n" 34
22

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


121
投票
echo "obase=16; 34" | bc

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

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

79
投票

十六进制转十进制:

$ echo $((0xfee10000))
4276158464

十进制转十六进制:

$ printf '%x\n' 26
1a

18
投票
bash-4.2$ printf '%x\n' 4294967295
ffffffff

bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff

7
投票

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

#!/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
投票

尝试:

printf "%X\n" ${MY_NUMBER}

3
投票

就我而言,我偶然发现了使用 printf 解决方案的一个问题:

$ printf "%x" 008
bash: printf: 008: invalid octal number

最简单的方法是使用 bc 的解决方案,在更高的帖子中建议:

$ bc <<< "obase=16; 008"
8


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
关于算术评估的文档页面

我相信 Bash 也有类似的功能。


2
投票
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
}

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

1
投票

这不是 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);
    }

1
投票

对于那些想要使用变量的人,首先通过运行导出它:

export NUM=100

然后运行:

printf "%x\n" $NUM

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

printf "%x\n" 100

注意:将 NUM 替换为您选择的变量名称。

导出使其成为环境变量(全局)。


-2
投票

哇,我没有意识到 printf 在 shell 中可用!

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

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

现在只需运行: ./十六进制 123

它返回: 0x7b

© www.soinside.com 2019 - 2024. All rights reserved.