118

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

打印?总的!现在使用它,但还有什么可用的?

4

12 回答 12

202

试过了printf(1)吗?

printf "%x\n" 34
22

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

于 2008-12-18T19:04:03.417 回答
116
echo "obase=16; 34" | bc

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

( echo "obase=16" ; cat file_of_integers ) | bc
于 2008-12-18T21:46:53.387 回答
72

十六进制转十进制:

$ echo $((0xfee10000))
4276158464

十进制转十六进制:

$ printf '%x\n' 26
1a
于 2009-12-15T16:11:10.363 回答
18
bash-4.2$ printf '%x\n' 4294967295
ffffffff

bash-4.2$ printf -v hex '%x' 4294967295
bash-4.2$ echo $hex
ffffffff
于 2012-05-02T06:12:29.673 回答
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
于 2010-03-12T14:24:04.670 回答
4

尝试:

printf "%X\n" ${MY_NUMBER}
于 2008-12-18T19:05:42.120 回答
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 也有类似的能力。

于 2008-12-18T22:26:20.170 回答
3

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

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

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

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

于 2016-02-09T14:59:18.857 回答
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
}
于 2019-07-25T19:39:50.897 回答
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
于 2014-08-28T08:20:01.107 回答
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);
    }
于 2018-08-23T08:35:47.013 回答
-2

哇,我没有意识到 shell 可以使用 printf !

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

echo "printf "0x%x\n" $1" > 十六进制 chmod +x 十六进制

现在只需运行:./hex 123

它返回:0x7b

于 2021-03-24T14:28:20.417 回答