web-dev-qa-db-fra.com

Conversion de décimales en hexadécimales dans un script UNIX Shell

Dans un script UNIX, que puis-je utiliser pour convertir des nombres décimaux en hexadécimal? Je pensais que od ferait l'affaire, mais il ne réalise pas que je lui donne des représentations ASCII de nombres.

printf? Brut! L'utiliser pour le moment, mais quoi d'autre est disponible?

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

Si vous souhaitez filtrer tout un fichier d'entiers, un par ligne:

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

Essayé printf(1)?

printf "%x\n" 34
22

Il y a probablement moyen de le faire avec des fonctions intégrées dans tous les shells mais ce serait moins portable. Je n'ai pas vérifié les spécifications de POSIX sh pour voir s'il possède de telles capacités.

167
Keltia

Hexadécimal à décimal:

$ echo $((0xfee10000))
4276158464

Décimal à hexadécimal:

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

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

Désolé ma faute, essayez ceci ...

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

Exemple:

$ ./dtoh 1024
400
5
pjhobbs

Dans zsh, vous pouvez faire ce genre de chose:

% 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

Exemple tiré de la page zsh docs sur l'évaluation arithmétique .

Je crois que Bash a des capacités similaires.

3
Alastair

Essayer:

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

Dans mon cas, je suis tombé sur un problème d'utilisation de la solution printf:

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

Le moyen le plus simple était d’utiliser la solution avec bc , suggérée plus haut:

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

1
Daniel Jeznach
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

Ce n'est pas un script Shell, mais c'est l'outil cli que j'utilise pour convertir les nombres parmi bin/oct/dec/hex

    #!/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);
    }
0
CodyChan