Você pode usar perl
:
$ perl -e 'print pack "I>", shift' $(( RANDOM << 17 | RANDOM << 2 | RANDOM >> 13 ))
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?
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)))"
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
:
adicione 2 ao topo da pilha principal
insira o valor superior da pilha principal e use seu valor como o
utput radix
adicione 65 (o valor decimal ASCII de A como convertido por printf
em minha localidade) no topo da pilha principal
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.