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

在UNIX shell脚本中将十进制转换为十六进制,unix,shell,hex,Unix,Shell,Hex,在UNIX shell脚本中,我可以使用什么将十进制数转换为十六进制数?我以为od会起作用,但它没有意识到我在给它输入数字的ASCII表示 printf?真恶心!现在使用它,但还有什么可用的吗?尝试了printf(1) 在所有shell中都可以使用内置函数来实现这一点,但它的可移植性较差。我还没有检查POSIX sh规范,看看它是否有这样的功能。试试: printf "%X\n" ${MY_NUMBER} 如果要筛选整型文件,每行一个: ( echo "obase=16" ; cat file

在UNIX shell脚本中,我可以使用什么将十进制数转换为十六进制数?我以为od会起作用,但它没有意识到我在给它输入数字的ASCII表示

printf?真恶心!现在使用它,但还有什么可用的吗?

尝试了
printf(1)

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

试试:

printf "%X\n" ${MY_NUMBER}
如果要筛选整型文件,每行一个:

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

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
例子取自


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

十六进制到十进制:

$ echo $((0xfee10000))
4276158464
$ printf '%x\n' 26
1a
十进制到十六进制:

$ echo $((0xfee10000))
4276158464
$ printf '%x\n' 26
1a

对不起我的错,试试这个

#!/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解决方案时遇到了一个问题:

$printf“%x”008
bash:printf:008:八进制数无效

最简单的方法是将解决方案与bc一起使用,建议参见更高的帖子:


$bc这不是一个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);
    }
#/usr/bin/perl
如果(@ARGV<2){
printf(“在bin/oct/dec/hex\n之间转换数字”);
printf(“\n用法:基本b/o/d/x num num num2…\n”);
出口
}

对于($i=1;$i哇,我没有意识到printf在shell中是可用的

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

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

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

它返回:

0x7b

@skipopoppy:如果你写:echo“obase=16;12 34 56”| bc,你会得到1E240,就像你写:echo“obase=16;123456”一样| bc。因此,在一行中处理任意数量的整数的方法是将每个数字放在自己的行中:tr'\015'如果碰巧有'bc',这很好,但是'printf'是bash的一部分itself@BillKarwin,或者zsh,或者busybox,但可能不是我没试过的shell?我不再安装plain sh了,但显然Skipoppy是还有什么其他选择吗are@Sridhar-Sarnobat,这是从十进制到十六进制的转换。我想你的意思是将十六进制转换为十进制。要做到这一点,请设置
ibase=16
。您可能想阅读以了解更多详细信息。您想添加bc区分大小写。意思是
echo“ibase=16;dead”|bc
将不起作用,你需要做
echo“ibase=16;DEAD”|bc
,我对此有点惊讶。它的POSIX没有比printf多得多。它甚至在“sh”中也能起作用。printf的精度不是很高。
bc
是。例如,以
2388628748574088759219909679752457540
作为输入,printf给我们提供了“结果太大”。BC方法适用于比标准int/long/bigint更大的东西,如果您想要十六进制的大写字母,请将
printf“%X”
与大写字母X一起使用。要强制输出“0x00”,您可以使用printf“0x%02X”……并且
BC
在任何地方都不可用(至少在我的嵌入式Linux上不可用)。我不得不问,printf有什么了不起的地方?许多常见编程语言都支持类似printf的格式,所以下面的printf解决方案对开发人员来说肯定是最容易理解的。天哪,我不知道-那是五年前的事了!我想我可能认为它不是真的shell或其他东西。感谢这对env.where
pri帮助很大ntf
hex
命令不可用。@benchuk哪里
printf
不可用?您的解决方案与几年前编写的解决方案相比增加了什么?@Matthieu它提到了带前导零的数字问题,Bash printf将其解释为八进制,并演示了一种避免该问题的解决方案。
-vAR
是一个bash扩展。中没有提到,仅当在没有参数的情况下调用
printf
时才会显示
$MY\u NUMBER
${MY\u NUMBER}之间的区别是什么
?@SasQ使用方括号强制解释要使用的符号,即仅我的编号。使用方括号可以执行${MY_TEXT\u FRAG\u${MY_NUMBER}}之类的操作来连接变量名。
# 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
    #!/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);
    }
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
}