Pergunta

Em um script UNIX shell, o que posso usar para números convertido decimais em hexadecimal? Pensei od faria o truque, mas ele não está percebendo que eu estou alimentando-representações ASCII de números.

printf? Bruto! Usá-lo para agora, mas o que mais está disponível?

Foi útil?

Solução

echo "obase=16; 34" | bc

Se você quiser filtrar um arquivo inteiro de inteiros, um por linha:

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

Outras dicas

printf(1) tentou?

printf "%x\n" 34
22

Há provavelmente maneiras de fazer isso com funções internas em todas as conchas, mas seria menos portátil. Eu não verifiquei as especificações sh POSIX para ver se ele tem tais capacidades.

Hexidecimal para decimal:

$ echo $((0xfee10000))
4276158464

Decimal para hexadecimal:

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

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

Desculpe minha culpa, tente este ...

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

Exemplo:

$ ./dtoh 1024
400

Tente:

printf "%X\n" ${MY_NUMBER}

Em zsh você pode fazer esse tipo de coisa:

% 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

Exemplo retirado zsh página docs sobre Aritmética Avaliação .

Eu acredito Bash tem capacidades semelhantes.

# 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

Este não é um shell script, mas é a ferramenta cli que estou usando para números converter entre bin / out / dez / 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);
    }
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
}

No meu caso, me deparei com um problema com o uso solução printf:

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

A maneira mais fácil era usar solução com bc , sugeriu no post superior:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top