Converter decimal para hexadecimal no roteiro UNIX shell
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?
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