Como converter um decimal não assinado (menor que 132) para 4 bytes (binário) no bash?

4

Exemplo:

$ decimal=$(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))
$ echo $decimal
$ printf "%08x" $decimal | xxd -r -p >bytes

O resultado está no arquivo bytes .

Pode ser feito em um único comando sem conversão desnecessária para hexadecimal primeiro?

    
por jfs 26.09.2014 / 08:42

3 respostas

2

Você pode usar perl :

$ perl -e 'print pack "I>", shift' $(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))
    
por 26.09.2014 / 08:54
3

Você pode usar o printf embutido para emitir bytes dados por códigos octal.

x=1193046
printf "$(printf "\%03o" $((x>>24&255)) $((x>>16&255)) $((x>>8&255)) $((x&255)))"
    
por 27.09.2014 / 04:51
1

dc pode pegar uma raiz de entrada arbitrária e produzir em uma raiz de saída igualmente arbitrária. Você se comunica com dc entregando-lhe primeiro um valor (ou uma sequência de valores separados por espaço em branco) e próximo um comando para manipular o valor. dc usa como padrão 10 bases para entrada e saída.

Por exemplo, para converter valores decimais arbitrários em binário (ou, pelo menos, em base 2) :

printf 2o%dp "'A" | dc
1000001

Isso funciona na seguinte lista de comandos para dc :

  1. adicione 2 ao topo da pilha principal

  2. insira o valor superior da pilha principal e use seu valor como o utput radix

  3. adicione 65 (o valor decimal ASCII de A como convertido por printf em minha localidade) no topo da pilha principal

  4. insira o valor superior da pilha principal e p rint seu valor para stdout na base atualmente especificada como a raiz de saída

dc também imprime valores ASCII para bytes conforme interpretados por sua base de entrada:

printf 8i%oP "'A" | dc
A

... e ...

printf 2i%sP 1000001 | dc
A

O processo é praticamente o mesmo de antes, exceto que i é usado para especificar a base i nput ao contrário da anterior o utput e que P é usado para interpretar o valor da pilha superior como um caractere ASCII na saída.

bc pode fazer muito do mesmo, embora tenda a sintaxe muito mais detalhada. Do man dc e man bc para mais. mudanças bitwise não estão no repertório de nenhum dos programas. Ainda assim, como você mostrou, qualquer shell POSIX pode lidar com esse fim com expansão aritmética com bastante facilidade.

    
por 27.09.2014 / 05:34