No Bash, como se faz a conversão de base de decimal para outra base, especialmente hexadecimal. Parece fácil seguir o outro caminho:
$ echo $((16#55))
85
Com uma pesquisa na web, encontrei um script que manipula matemática e caracteres para fazer a conversão, e eu poderia usá-lo como uma função, mas pensei que o bash já teria uma conversão básica embutida - faz isso?
bash
shell
text-processing
hex
Dave Rove
fonte
fonte
Respostas:
Com
bash
(ou qualquer shell, desde que oprintf
comando esteja disponível (um comando POSIX padrão, geralmente construído nos shells)):Com
zsh
, você também pode fazer:Isso funciona para bases de 2 a 36 (com
0-9a-z
distinção entre maiúsculas e minúsculas como os dígitos).Com
ksh93
, você pode usar:Que funciona para bases de 2 a 64 (com
0-9a-zA-Z@_
os dígitos).Com
ksh
ezsh
, há também:Embora isso seja limitado a bases de até 36 em ksh88, zsh e pdksh e 64 em ksh93.
Observe que todos esses são limitados ao tamanho dos
long
números inteiros no seu sistema (int
com alguns shells). Para qualquer coisa maior, você pode usarbc
oudc
.Com bases suportadas que variam de 2 a algum número exigido pelo POSIX, pelo menos, até 99. Para bases maiores que 16, dígitos maiores que 9 são representados como números decimais preenchidos com 0 e separados por espaço.
Ou o mesmo com
dc
(bc
costumava ser (e ainda está em alguns sistemas) um invólucrodc
):fonte
#
?bash
builtins, você pode entrada números em qualquer base, mas não de saída em qualquer base diferente de 8, 10 e 16. Para outras bases, você precisa de outro shell comozsh
ouksh
ou utilizaçãobc/dc
.alias hex="printf '%x\n'"
Use printf:
Para atribuir o valor a uma variável, use a substituição de comando:
fonte
-v
opção para o printf interno:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
) é desnecessário aqui; Eu evitaria isso.-v
evitaria o garfo e o tubo (no bash, não o ksh93, que não se bifurca aqui comoprintf
está embutido). Observe que$((16#55))
também não é padrão.x=$(some_builtin)
?Use a substituição de expansão aritmética integrada presente em todos os shells compatíveis com POSIX - que é praticamente universal nos dias de hoje.
e
CUIDADO: Particularmente no último exemplo, a expansão pode causar resultados inesperados - os dígitos hexadecimais na variável 'hex' precisam formar uma constante hexadecimal legal, caso contrário, mensagens de erro potencialmente obscuras ocorrem. por exemplo, se 'hex' fosse '0xdead', a expansão aritmética se tornaria 0x0xdead, o que não é interpretável como uma constante. Obviamente, nesse caso, a expansão aritmética $ (($ hex)) faria o truque. É deixado como um exercício para o leitor criar a correspondência simples de padrão de processamento de substring que removeria um prefixo '0x' opcional.
fonte
Você pode usar a biblioteca awk Velour :
Ou:
fonte