Converti decimale in esadecimale nello script della shell UNIX

In uno script di shell UNIX, cosa posso usare per convertire i numeri decimali in esadecimali? Pensavo che od avrebbe fatto il trucco, ma non mi sto rendendo conto che gli sto dando delle rappresentazioni ASCII dei numeri.

printf? Schifoso! Usandolo per ora, ma cos’altro è disponibile?

echo "obase=16; 34" | bc 

Se si desidera filtrare un intero file di numeri interi, uno per riga:

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

Provato printf(1) ?

 printf "%x\n" 34 22 

Ci sono probabilmente modi per farlo con le funzioni incorporate in tutte le shell, ma sarebbe meno portabile. Non ho controllato le specifiche SH POSIX per vedere se ha tali capacità.

Esadecimale al decimale:

 $ echo $((0xfee10000)) 4276158464 

Decimale in esadecimale:

 $ 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 

Scusa colpa mia, prova questo …

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

Esempio:

 $ ./dtoh 1024 400 

Provare:

 printf "%X\n" ${MY_NUMBER} 

In zsh puoi fare questo genere di cose:

 % 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 

Esempio tratto dalla pagina zsh doc sulla valutazione aritmetica .

Credo che Bash abbia capacità simili.

 # 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 

Nel mio caso, sono incappato in un problema con l’utilizzo della soluzione printf:

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

Il modo più semplice era usare la soluzione con bc , suggerita in post più alto:

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

Questo non è uno script di shell, ma è lo strumento cli che sto usando per convertire i numeri tra 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); }