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


110

UNIXシェルスクリプトで、10進数を16進数に変換するために何を使用できますか?私はodでうまくいくと思っていましたが、数値のASCII表現をフィードしていることに気づいていません。

printf?キモい!今はそれを使用していますが、他に何が利用できますか?


8
私は尋ねなければなりません、printfの総体は何ですか?多くの一般的なプログラミング言語はprintfに似たフォーマットをサポートしているため、以下のprintfソリューションは開発者が理解するのに最も簡単です。
Michael Scheper 2013年

4
男の子、わかりません。それは5年前のことです。多分それは本当の甲羅ではなかったと思いました。
skiphoppy 2013

回答:


108
echo "obase=16; 34" | bc

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

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

1
私はbc(1)とdc(1)の両方を見て、それを逃しました。
Keltia、2008

3
@skiphoppy:あなたが書く場合:echo "obase = 16; 12 34 56" | bcは、1E240を取得します。これは、書き込んだ場合とまったく同じです。echo "obase = 16; 123456" | 紀元前。したがって、任意の数の整数をすべて1行で処理する方法は、各数値を独自の行に配置することです:tr '' '\ 015' <input | bc(ブランクを改行にマップ)。
ジョナサンレフラー

1
たまたま 'bc'があればこれは素晴らしいですが、 'printf'はbash自体の一部です
fuzzyTew

1
@Bill Karwin、またはzsh、またはbusyboxですが、私が試していないいくつかのシェルではないでしょうか?私はもうプレーンshをインストールしていませんが、skiphoppyは他にどのようなオプションがあるかを明らかに探しています
fuzzyTew

2
@ Sridhar-Sarnobat、これ 10進数から16進数です。16進数を12進数に変換するという意味だと思います。これを行うには、を設定しibase=16ます。詳細については、bcマニュアルをご覧ください。
ビルカーウィン2015年

186

試しましたprintf(1)か?

printf "%x\n" 34
22

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


5
printfよりも多くのPOSIXを取得していません。これは「sh」でも機能します。
オーウェルファン

4
printfは不正確な精度ではありません。 bcです。たとえば、238862874857408875879219909679752457540printfを入力として使用すると、「結果が大きすぎます」と表示されます。BC法は、標準のint / long / bigintよりも大きいものに最適です
Andrew Backer

3
そして、あなたが進、使用中の大文字をしたい場合はprintf "%X"、大文字のXと
andrybak

3
そして、「0x00」のような出力を強制するには、printf「0x%02X」を使用できます
gbetous

1
...そしてbcどこでも利用できるわけではありません(少なくとも私の組み込みLinuxでは)。
Matthieu 2018

69

16進数から10進数へ:

$ echo $((0xfee10000))
4276158464

10進数から16進数:

$ printf '%x\n' 26
1a

15
bash-4.2$ printf '%x\n' 4294967295
ffffffff

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

1
-v VARbashの拡張機能です。manページには記載されていませんが、printf引数なしで呼び出した場合にのみ明らかにされます
Adrian W

5

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

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

1
おかげでこれはenvに大いに役立ちました。どこprintfhexコマンドは使用できません。
ベンチク

2
@benchukはprintf利用できませんか?
Matthieu



2

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

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

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

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


あなたのソリューションは何年も前に書かれたものに何を追加しますか?
Matthieu

@Matthieuこれは、Bash printfが8進数として解釈するのに役に立たない、先行ゼロのある数値の問題に言及し、問題を回避するソリューションを示しています。
mwfearnley

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

これはシェルスクリプトではありませんが、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);
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.