Alguém pode me ajudar a converter um número hexadecimal em número decimal em um script de shell?
Por exemplo, eu quero converter o número hexadecimal bfca3000
em decimal usando um script de shell. Eu basicamente quero a diferença de dois números hexadecimais.
Meu código é:
var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3)) # [Line 48]
Ao executar, recebo este erro:
Line 48: -: syntax error: operand expected (error token is "-")
Respostas:
Para converter de hex para decimal, há muitas maneiras de fazer isso no shell ou com um programa externo:
Com festança:
com bc:
com perl:
com printf :
com Pitão:
com rubi:
com node.js:
com rinoceronte:
com groovy:
fonte
printf
solução é POSIX? Se sim, é o melhor :)$((0xff))
, ou seja, com prefixo hexadecimal do tipo C em vez de16#
, emboraN#
seja claramente mais geral.echo $((077E9F2DBF49D100001#FF))
excede o limite inteiro de 64 bits de 2 ^ 64.bc
lida com isso corretamente.Lidar com uma versão incorporada muito leve do busybox no Linux significa que muitos dos comandos tradicionais não estão disponíveis (bc, printf, dc, perl, python)
Agradecemos a Peter Leung por esta solução.
fonte
echo $((0x077E9F2DBF49D100001))
excede o limite inteiro de 64 biit de 2 ^ 64.bc
lida com isso corretamenteMais uma maneira de fazer isso usando o shell (bash ou ksh, não funciona com o dash):
fonte
#
símbolo? Existem outros aplicativos ou documentação para ler mais sobre seu uso?Várias ferramentas estão disponíveis para você a partir de um shell. Sputnick lhe deu uma excelente visão geral de suas opções, com base em sua pergunta inicial. Ele definitivamente merece votos pelo tempo que passou dando a você várias respostas corretas.
Mais um que não está na lista dele:
Mas se tudo o que você quer fazer é subtrair, por que se preocupar em mudar a entrada para a base 10?
O
dc
comando é "desk calc". Ele também recebe a entrada do stdin, comobc
, mas em vez de usar a "ordem das operações", ele usa a notação de empilhamento ("polonês reverso"). Você fornece as entradas que adiciona a uma pilha, depois os operadores que retiram itens da pilha e pressionam os resultados.Nos comandos acima, temos o seguinte:
16i
- diz ao dc para aceitar a entrada na base 16 (hexadecimal). Não altera a base de saída.BFCA3000
- seu número inicial17FF
- um número hexadecimal aleatório que escolhi para subtrair do seu número inicial-
- pegue os dois números que pressionamos e subtraia o último do anterior, depois empurre o resultado de volta para a pilhap
- imprima o último item na pilha. Isso não muda a pilha, então ...10o
- diz ao dc para imprimir sua saída na base "10", mas lembre-se de que nosso esquema de numeração de entrada é atualmente hexadecimal, portanto "10" significa "16".p
- imprima o último item na pilha novamente ... desta vez em hexadecimal.Você pode construir soluções matemáticas fabulosamente complexas com dc. É bom ter em sua caixa de ferramentas para scripts de shell.
fonte
O erro conforme relatado aparece quando as variáveis são nulas (ou vazias):
Isso poderia acontecer porque o valor dado a bc estava incorreto. Pode ser que o bc precise de valores UPPERcase. Precisa
BFCA3000
, nãobfca3000
. Isso é facilmente corrigido no bash, basta usar a^^
expansão:Isso mudará o script para isso:
Mas não há necessidade de usar bc [1], pois o bash poderia executar a tradução e a subação diretamente:
[1] Nota: Estou assumindo que os valores possam ser representados na matemática de 64 bits, pois a diferença foi calculada no bash no seu script original. Bash é limitado a números inteiros menores que ((2 ** 63) -1) se compilados em 64 bits. Essa será a única diferença com bc que não possui esse limite.
fonte
No traço e outras conchas, você pode usar
para converter um número hexadecimal em decimal. Isso não é específico do bash ou do ksh.
fonte
printf "%d" 0xff