Por que você não vê código binário quando abre um arquivo binário com o editor de texto?

51

Por que você não vê código binário quando abre um arquivo binário com o editor de texto? Por exemplo, quando abro uma imagem com o editor de texto, vejo caracteres estranhos e também caracteres legíveis por humanos; mas a imagem deve ser codificada em binário.

Templários
fonte
8
O que você esperava? Como você acha que isso deve ser arquivado?
Nikodemus RIP
2
Eu me pergunto por que mais editores não oferecem ao binário como seqüências ASCII 1/0 brutas.
Xeoncross
7
@Xenocross: como a sequência bruta 0/1 é inútil, é muito difícil de usar para decodificação manual, porque ocupa muito espaço na tela; A exibição hexadecimal é geralmente mais superior para decodificação manual. E com algum treinamento, você pode converter hexadecimal em binário e vice-versa de maneira rápida e fácil.
Lie Ryan
3
@Fiasco Labs: Pedantry: um número hexadecimal com dois dígitos - 00 a FF, que se traduz em decimal de 0 a 255 (8 bits representando 2 ^ 8 = 256 estados possíveis).
Piskvor
11
@Piskvor - Obrigado por colocá-lo melhor do que eu. deadbeef é um número hexadecimal com 8 dígitos, para o registro. ; ^)
Fiasco Labs

Respostas:

83

Dados binários e de texto não são separados: são simplesmente dados . Depende da interpretação que os torna um ou outro. Se você abrir dados binários (como um arquivo de imagem) em um editor de texto, muitos deles não farão sentido, porque não se encaixam na interpretação escolhida (como texto).

O que você chama de texto é um subconjunto do conteúdo possível do arquivo: dados que em um determinado conjunto de caracteres são convertidos em caracteres legíveis.

Por exemplo, em ASCII , você pode ver que, dos 128 valores "permitidos", apenas cerca da metade são letras e números, 30 são pontuação e o restante são caracteres de controle . O último grupo simplesmente não é muito usado em arquivos de texto e não possui uma representação textual realmente boa. Alguns deles são caracteres de tabulação e nova linha , onde os editores de texto já precisam ser criativos para exibi-los.

Alguns editores de texto têm opções para exibir explicitamente espaços em branco. Em seguida, eles serão desenhados como caracteres, além de seu comportamento de formatação regular (que também é apenas a interpretação desses caracteres).

O ASCII puro interpreta apenas 128 valores. Os bytes usados ​​para armazenar essas informações têm 256 valores possíveis cada, portanto metade dos valores possíveis não são permitidos no ASCII. Esses são, por exemplo, usados ​​em conjuntos de caracteres específicos da região, como o Latim 1, mas no ASCII, eles são indefinidos. Eles não têm representação útil em um visualizador de texto que possa lidar apenas com ASCII.


Dados binários geralmente não são interpretados como texto. Portanto, nesses arquivos, todos os valores possíveis de bytes são comumente encontrados. Todo o resto seria um desperdício (e é por isso que você pode compactar muito bem o texto). Os formatos de arquivo de imagem são complicados, e você geralmente não os vê como texto, portanto, eles não precisam ser legíveis.

Como não há interpretação de dados comum (conjunto de caracteres) que mapeia todos os valores possíveis para caracteres legíveis, e como isso não faria muito sentido de qualquer maneira (como não é um texto legível), as partes principais são exibidas como sem sentido.


Um editor hexadecimal escolhe uma representação diferente para os dados: exibe cada byte como dois dígitos hexadecimais . É apenas uma representação diferente e uma com um conjunto de caracteres facilmente legível por humanos: todos os 256 valores de bytes possíveis podem ser representados como dois dígitos hexadecimais.

Como existe um mapeamento fácil de dados binários para hexadecimal e vice-versa (4 dígitos binários de / para um dígito hexadecimal), e o binário contém muito pouca informação por dígito, hexadecimal é geralmente a maneira preferida para humanos lerem binário, a menos que haja razões para preferir uma representação diferente.


Alguns editores de texto podem ter um modo de editor hexadecimal e alguma heurística que tentaram determinar se um arquivo é texto ou binário e selecionam automaticamente um modo ou outro. Mas isso pode ser difícil de corrigir e não é uma propriedade específica do arquivo que diz se é de um tipo ou de outro.


Alguns clientes de FTP solicitam que você especifique quais terminações de arquivos são usadas para dados de texto . Esses programas alteram o conteúdo do arquivo para corresponder ao sistema operacional da máquina à qual você está conectado, pois o Windows usa uma sequência de caracteres de final de linha diferente ( CR/LF) do que Linux e Unix (incluindo Mac OS X; LF).

Daniel Beck
fonte
4
Ughh, a LF me mordeu mais vezes do que eu gostaria de lembrar.
surfasb
32

Porque você o abriu em um editor de texto , não em um editor binário .

Ignacio Vazquez-Abrams
fonte
22
Como você viu, texto.
Ignacio Vazquez-Abrams
11
Texto como uma representação de números hexadecimais (0-f) organizados em pares (bytes). Se você deseja binário, converta o hexadecimal em binário em uma sequência sem sentido de zeros e uns. Hex é mais legível por humanos e mais fácil de entender.
Fiasco Labs
2
Tenho que dizer que: alguém deve dar o passo ousado para lançar um editor binário real, com Ones e Zeros , (e talvez separar painéis com transliterações hex / char / dec relacionadas) com o único objetivo de ensinar esse tipo de coisa. Sei que não deveriam, mas a mídia popular e os professores de matemática que fingem conhecer computadores definem todas as expectativas erradas para crianças ansiosas que desejam aprender.
ZJR
@ZJR: Não há razão para que não devam. Muitos editores hexadecimais permitem visualizar o conteúdo do arquivo em binário. Os programadores geralmente não a consideram tão útil quanto a visualização hexadecimal, para que você não ouça tanto.
David Z
16

Tudo tem a ver com contexto e interpretação. O que há no seu computador são padrões de alta e baixa tensão, ou regiões magnetizadas de um disco, que só ganham significado quando decidimos como queremos interpretá-los.

Sob diferentes circunstâncias, o padrão baixo-alto-baixo-baixo-baixo-baixo-baixo-alto pode significar o número 65, uma letra maiúscula 'A', uma cor azul-celeste, que um cliente pediu café, a data 'março 6 'ou qualquer coisa, realmente.

Quando você abre seu arquivo de imagem em um programa gráfico, ele sabe interpretá-lo como uma imagem, sabe quais padrões indicam o formato da imagem, quais padrões indicam o tamanho da imagem e assim por diante.

Quando você abre seu arquivo de imagem em um editor de texto, ele é tratado como texto. Este é um formato muito simples, muito mais próximo do que realmente está acontecendo no computador, mas ainda há alguma interpretação em andamento. Especificamente, quase todos os padrões são interpretados como um personagem em particular, alguns normais como AZ, mas também alguns caracteres estranhos. Alguns padrões não aparecem como caracteres, mas são tratados como formatação básica: nova linha, guia.

(A situação é um pouco complicada por coisas como Unicode e codificações de texto como UTF-8, mas não tratarei delas aqui por uma questão de simplicidade.)

Quando você tem um arquivo binário aberto em um editor de texto, tome cuidado para não fazer alterações, pois quase todas as alterações feitas atrapalham completamente a interpretação normal do conteúdo do arquivo, ou seja, arruinam o arquivo e o tornam inutilizável.

Andrew Turner
fonte
3

Como um exemplo simplificado, considere um arquivo de imagem aberto com um editor de texto.

A imagem é um padrão de xadrez simples, com quadrados de 3 pixels de largura e uma borda cinza de 1 pixel entre cada quadrado. - três pixels pretos, um pixel de borda cinza, três pixels de branco, um pixel de borda cinza, repita.

A primeira linha nessa imagem teria o seguinte valor quatro vezes:

Black    Black    Black    Gray     White    White    White    Gray
0x000000 0x000000 0x000000 0x7F7F7F 0xFFFFFF 0xFFFFFF 0xFFFFFF 0c7F7F7F

(Em Hex, em vez de Binário - a string em Binário seria quatro vezes maior - 0x7F sendo substituído por 0b01111111)

Se você carregar essa sequência de dados em um editor de texto, obterá o seguinte texto:

[Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Nul] [Del] [Del] [Del] [Em branco] [Em branco] [Em branco] [Em branco] [Em branco] [Em branco ] [Em branco] [Em branco] [Em branco] [Em branco] [Del] [Del] [Del]

Isso ocorre porque 0x00 é o código ASCII para o valor Nulo e você precisa escrever isso três vezes para obter o valor de um pixel preto (em 24 BMP de qualquer maneira) e você tem três pixels pretos. Então 0x7F é o código ASCII para Excluir e você precisará disso três vezes para obter um pixel cinza. 0xFF não é um código ASCII valioso para nada em particular - mesmo no conjunto ASCII estendido - e você precisa escrevê-lo 9 vezes para obter 3 pixels brancos. Terminando, você recebe mais três exclusões para escrever um pixel cinza.

Uma maneira diferente de mostrá-lo, que pode ser mais útil, é o exemplo inverso - o que você precisa gravar em um arquivo para obter zeros e zeros quando aberto em um editor de texto?

O ASCII codifica zero e um, é claro! Um zero em um editor de texto não é armazenado como um único bit com o valor 0, é armazenado como 8 bits com o valor 0b00110000 ou em hexadecimal 0x30

O código ASCII para '0' é 0x30 e o código ASCII para '1' é 0x31; portanto, se você deseja armazenar um padrão de xadrez como zeros e zeros, seu arquivo será parecido com este:

text editor:
10101010
01010101
10101010
01010101

Stored data (ASCII values for '1', '0' and 'new line'):
0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x0D 0x31 0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x0D  0x30 0x31 0x30 0x31 0x30 0x31 0x30 0x31

Há muito mais do que isso - os arquivos têm início, parada e metadados e todos os outros tipos de coisas, mas a lição de casa e a resposta para sua pergunta são:

A menos que os primeiros 8 bits do seu arquivo sejam 0b00110000, seu editor de texto não gravará '0' porque esse é o código ASCII para o caractere '0'. A menos que os primeiros 8 bits do seu arquivo sejam 0b00110001, seu editor de texto não escreverá '1' porque esse é o código ASCII para o caractere '1'.

medivh
fonte
0

O editor não é inteligente o suficiente para descobrir se algum texto faz sentido ou não; portanto, ele exibe qualquer arquivo como texto, a menos que seja especificamente solicitado a fazer o contrário, se tiver esse recurso. Como outros apontaram, alguns editores têm o recurso de exibir hexadecimal.

Emilio M Bumachar
fonte
O UltraEdit é inteligente o suficiente - alterna para o modo de edição hexadecimal para esses arquivos.
Peter Mortensen