web-dev-qa-db-ja.com

UNIXシェルスクリプトで10進数を16進数に変換する

UNIXシェルスクリプトでは、10進数を16進数に変換するために何を使用できますか? odでうまくいくと思ったが、数字のASCII表現を与えていることに気付いていない。

printf?キモい!今のところそれを使用していますが、他に何が利用可能ですか?

101
skiphoppy
echo "obase=16; 34" | bc

整数のファイル全体を1行に1つずつフィルタリングする場合:

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

printf(1)を試しましたか?

printf "%x\n" 34
22

すべてのシェルに組み込み関数を使用してそれを行う方法はおそらくありますが、移植性は低くなります。 POSIX shの仕様を調べて、そのような機能があるかどうかを確認していません。

174
Keltia

16進数から10進数:

$ echo $((0xfee10000))
4276158464

10進数から16進数:

$ printf '%x\n' 26
1a
64
pjhobbs
bash-4.2$ printf '%x\n' 4294967295
ffffffff

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

すみません、これを試してください...

#!/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
pjhobbs

試してください:

printf "%X\n" ${MY_NUMBER}
4
Rob Wells

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にも同様の機能があると思います。

3
Alastair
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
sjas
# 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
amol s. patil

これはシェルスクリプトではありませんが、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
CodyChan

私の場合、printfソリューションの使用に関する1つの問題に遭遇しました。

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

最も簡単な方法は、bcでソリューションを使用することでした。

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

0
Daniel Jeznach