I would like to simply read the binary of a file as the computer reads it …
Isso não é realmente possível. O computador lê como dois níveis diferentes de voltagem em algum lugar, o que você obviamente não pode ver. Eu suponho que com um computador muito mais lento (não as máquinas multi-GHz que são comuns hoje em dia), você poderia conectar um osciloscópio de alta largura de banda e quase ver / lê-lo como o computador faz. Essa é uma questão de eletrônica, e certamente não é uma resposta útil. Em última análise, qualquer modo que é exibido em seu monitor é uma abstração; simplesmente não há como perceber diretamente as centenas de bilhões, se não trilhões de mudanças de voltagem por segundo que os eletrônicos realmente lidam.
A maneira normal de editar dados binários é em hexadecimal com um editor hexadecimal. O hexadecimal é usado porque é mais fácil para os seres humanos (muito mais curto), mas ainda tem uma correspondência direta com os bits; cada "nibble" de hex (0-9a-f) representa exatamente 4 bits. A maneira tradicional de exibir isso é feita por xxd
; mostra praticamente tudo que você precisa para entender o arquivo binário que está editando: à esquerda, onde você está no arquivo (offset); à direita, o que é, se texto (bastante comum em arquivos binários); e no meio, os dados binários brutos (apresentados em hexadecimal). xxd
é semelhante para seu modo binário, usando apenas bits em vez de hexadecimal.
Se você realmente quer apenas cortar essa informação útil, xxd
tem uma opção para o modo hexadecimal ( -p
), mas não para o modo binário. Você pode apenas usar cut
embora:
$ echo 'Hello, world' | xxd -b | cut -c 11-63
01001000 01100101 01101100 01101100 01101111 00101100
00100000 01110111 01101111 01110010 01101100 01100100
00001010
Ou se você realmente não quer formatação, algo como:
perl -nE 'print unpack("B*", $_); END { print "\n"; }'
(revertido por perl -nE 'print pack("B*", $_);'
)
mas se você realmente quiser entender ou editar dados binários, um editor hexadecimal é de longe sua melhor aposta para uma ferramenta de propósito geral.
BTW: Seu binário → editor de texto → binário é fácil no modo hexadecimal; xxd -r
faz isso. Os trechos perl acima farão isso por binário:
$ echo 'Hello, world!' | perl -nE 'print unpack("B*", $_); END { print "\n"; }' | tee /dev/stderr | perl -nE 'print pack("B*", $_);'
0100100001100101011011000110110001101111001011000010000001110111011011110111001001101100011001000010000100001010
Hello, world!
Eu coloquei o tee
lá para mostrar os bits sendo passados entre eles - note como é completamente incompreensível comparado a xxd
:
$ echo 'Hello, world!' | xxd | tee /dev/stderr | xxd -r
00000000: 4865 6c6c 6f2c 2077 6f72 6c64 210a Hello, world!.
Hello, world!