Binário para hexadecimal e decimal em um script de shell

19

Eu tenho um contexto onde eu preciso converter binário para hexadecimal e decimal e vice-versa em um script de shell. Alguém pode me sugerir uma ferramenta para isso?

    
por Bangi 19.02.2013 / 07:40

6 respostas

34

É bastante simples fazer a conversão de binário em bash puro ( echo e printf são builtins):

De binário a decimal

$ echo "$((2#101010101))"
341

Binário para hexadecimal

$ printf '%x\n' "$((2#101010101))"
155

Voltando ao binário usando bash sozinho é um pouco mais complexo, então eu sugiro que você veja as outras respostas para soluções para isso.

    
por 19.02.2013 / 08:40
11

Supondo que por binário, você quer dizer dados binários como em dados com qualquer valor de byte possível, incluindo 0, e não números de base 2:

Para converter de binário, od (padrão), xxd (vem com vim ) ou perl ' unpack vêm à mente.

od -An -vtu1 # for decimal
od -An -vtx1 # for hexadecimal

xxd -p # for hexa

perl -pe 'BEGIN{$\="\n";$/=};$_=unpack("H*",$_)' # like xxd -p

# for decimal:
perl -ne 'BEGIN{$\="\n";$/=;$,=" "}; print unpack("C*",$_)'

Agora, para converter de volta para binário, awk (padrão), xxd -r ou perl ' pack :

Da saída decimal de od -tu1 ou perl acima:

LC_ALL=C awk '{for (i = 1; i <= NF; i++) printf "%c", $i}'
perl -ape '$_=pack("C*",@F)'

Do hexa perl ou xxd -p acima:

xxd -r -p
perl -pe 'chomp;$_=pack("H*",$_)'
    
por 19.02.2013 / 08:08
9

Você pode usar o bc para isso manipulando os parâmetros ibase e obase :

O truque é que você precisa ser explícito sobre as bases. Então, se o seu ibase for 2, então se você definir o seu obase como 10, ele não fará nada, já que 10 no binário é 2. Assim, você precisa usar a notação hexadecimal.

Então binário para decimal seria (observe que obase é A)

De binário para decimal:

$> echo 'ibase=2;obase=A;11110001011010'|bc
15450

Binário para hexadecimal:

$> echo 'ibase=2;obase=10000;11110001011010'|bc
3C5A

Se a 'base de saída' obase for alterada primeiro, deverá ser mais fácil:

$> echo 'obase=10;ibase=2;11110001011010'|bc
15450
$> echo 'obase=16;ibase=2;11110001011010'|bc
3C5A
    
por 19.02.2013 / 08:09
2

Se você quer dizer converter números de base-2 a 10 ou 16 e voltar, bc é a ferramenta padrão para fazer isso como já mencionado por psarossy .

decimal=123
binary=$(echo "obase=2;$decimal" | bc)
hex=$(echo "obase=16;ibase=2;$binary" | bc)

Alguns shells como zsh têm suporte embutido para conversão de base como parte de seus operadores de expansão aritmética:

decimal=123
binary=$(([##2]decimal))
hex=$(([##16]decimal))
hex=$(([##16]2#$binary))
decimal=$((2#$binary))

e assim por diante.

Tanto ksh93 como zsh também suportam:

typeset -i2 binary=123
typeset -i16 dec2hex=123 bin2hex='2#1111'

Mas, quando expandido, $binary terá um prefixo 2# ou 16# (que você pode remover com ${binary#*#} .

ksh93 também suporta:

printf "%..2d\n" 123

para converter em binário.

    
por 19.02.2013 / 09:28
1

Para uso binário a hexadecimal: a ferramenta xxd no linux e para binário a decimal você pode usar a ferramenta qalculate.

Para ajuda sobre o tipo xxd xxd --help ou man xxd no Linux.

    
por 19.02.2013 / 07:58
1

Você pode usar o PHP:

$ php -r 'printf("%b", 11);'
1011

Ou Perl:

$ perl -e 'print unpack("B*", pack("c", 11))'
00001011

$ perl -e 'print unpack("B*", pack("C", 11))'
00001011

$ perl -e 'print unpack("B*", pack("W", 11))'
00001011

$ perl -e 'print unpack("B*", pack("n", 11))'
0000000000001011

$ perl -e 'print unpack("B*", pack("N", 11))'
00000000000000000000000000001011

Ou POSIX Awk svnpenn / stdlib :

$ awklib 'BEGIN {print mt_basecon(1011, 2, 16)}'
B

$ awklib 'BEGIN {print mt_basecon(1011, 2, 10)}'
11

$ awklib 'BEGIN {print mt_basecon("B", 16, 2)}'
1011

$ awklib 'BEGIN {print mt_basecon(11, 10, 2)}'
1011
    
por 28.03.2017 / 14:01