Veja alguns sed
para coaxar dc
para traduzir a saída de od
para a base 2:
od -t d1z -w4 -v -N12 </dev/urandom |
sed -e '1i2o' -e 's/.*/[&]p/p;$d
s/>/]n [>/;s/[^ ]*/&]n [/;h;s/>.*//;
s/ -/ _/g;s/ [^] [][^ ]*/ ]n&n [ /g;G
s/\n[^>]*//' |
dc
É um pouco mais simples agora - o que não é mais rápido - mas ainda não é uma rainha da beleza. Também imprime os valores decimais e base 2 de todos os bytes.
Quando eu corro, fico:
0000000 -43 125 -117 -39 >.}..<
0000000 -101011 1111101 -1110101 -100111 >.}..<
0000004 62 28 80 61 >>.P=<
0000004 111110 11100 1010000 111101 >>.P=<
0000010 6 14 120 -16 >..x.<
0000010 110 1110 1111000 -10000 >..x.<
0000014
Ou ...
echo aBcD | od -t d1z -w4 -v | sed ... | dc
0000000 97 66 99 68 >aBcD<
0000000 1100001 1000010 1100011 1000100 >aBcD<
0000004 10 >.<
0000004 1010 >.<
0000005
As larguras de campo podem usar um pouco de trabalho, mas são todas suas. Você não precisa da opção -N12
- eu apenas usei isso para não engasgar com um interminável canal de dados pseudo-aleatórios. E o -w4
especifica 4 bytes por linha, mas você deve ser capaz de usar qualquer número de bytes. Além disso, o comando 1i2o
sed
é uma instrução dc
em relação à sua base de saída - 2
para binário - mas qualquer base entre 2 e 16 deve funcionar da mesma forma. Se desejar ver, por exemplo, saída hexadecimal e base 2, você precisará adicionar '16i' à primeira instrução sed
e alterar a opção od
-t d1z
para t x1z
.
Outras opções incluem ...
printf faz isso:
printf '%o\n%x\n' 128 128
200
80
... até mesmo ...
printf '%o\n%x\n' "'a" "'a"
141
61
O binário não é tão simples, mas bc
pode fazer tudo isso se você definir seu obase=
de acordo com suas especificações:
printf 'obase=2;%d
obase=8;%d
obase=16;%d
obase=2;%d
' 64 128 "'A" "'a" |
bc
OUTPUT
1000000
200
41
1100001
dc
não é tão falado:
printf '%do%dn10P' 2 64 8 128 16 "'A" 2 "'a" |dc
OUTPUT
1000000
200
41
1100001
Faça man dc bc
para mais informações.
E, novamente, para fluxos de arquivos, você sempre pode usar od
:
for o in o d x ; do
echo aBcD |
od -A n -t ${o}1z -v -w4
done
OUTPUT
141 102 143 104 >aBcD<
012 >.<
97 66 99 68 >aBcD<
10 >.<
61 42 63 44 >aBcD<
0a >.<
Com ^ que ^ eu digo a od
para não imprimir deslocamentos - que eu agora estou criticando - que eu quero saídas de -t
ype o
, d
ou x
um byte de cada vez e que eu quero a representação ASCII z
de cada byte anexado ao final da linha, -v
erbosely (para que não apenas me imprima 0*
para 0000
) em -w4
bytes por linha.
Sem -A n
, imprime:
0000000 141 102 143 104 >aBcD<
0000004 012 >.<
0000005
0000000 97 66 99 68 >aBcD<
0000004 10 >.<
0000005
0000000 61 42 63 44 >aBcD<
0000004 0a >.<
0000005
E qualquer combinação de dc
bc
od
é obviamente possível em |pipeline
.