Почему вы не видите двоичный код при открытии двоичного файла в текстовом редакторе?

51

Почему вы не видите двоичный код при открытии двоичного файла в текстовом редакторе? Например, когда я открываю изображение в текстовом редакторе, я вижу некоторые странные символы, а также некоторые читаемые человеком символы; но изображение должно быть закодировано в двоичном виде.

тамплиер
источник
8
Чего ты ожидал? Как вы думаете, это должно быть заархивировано?
Никодим РИП
2
Интересно, почему больше редакторов не предлагают двоичный файл в виде необработанных ASCII 1/0 последовательностей.
Xeoncross
7
@ Xenocross: поскольку необработанная последовательность 0/1 бесполезна, она слишком громоздка для ручного декодирования, поскольку она занимает огромное количество экранного пространства; шестнадцатеричный дисплей, как правило, лучше для ручного декодирования. А после некоторого обучения вы можете быстро и легко перевести шестнадцатеричный код в двоичный и наоборот.
Ли Райан
3
@Fiasco Labs: Pedantry: одно шестнадцатеричное число с двумя цифрами - от 00 до FF, которое переводится в десятичное число 0 - 255 (8 бит, представляющих 2 ^ 8 = 256 возможных состояний).
Писквор
1
@Piskvor - Спасибо, что выразил это лучше, чем я. deadbeef - это шестнадцатеричное число с 8 цифрами, для записи. ; ^)
Fiasco Labs

Ответы:

83

Двоичные и текстовые данные не разделены: это просто данные . Это зависит от интерпретации, которая делает их одним или другим. Если вы откроете двоичные данные (например, файл изображения) в текстовом редакторе, большая часть этого не будет иметь смысла, поскольку она не соответствует выбранной вами интерпретации (как текст).

То, что вы называете текстом, является подмножеством возможного содержимого файла: Данные, которые в данном наборе символов преобразуются в читаемые символы.

Например, в ASCII вы можете видеть, что из 128 «разрешенных» значений только около половины составляют буквы и цифры, 30 - знаки пунктуации, а остальные - управляющие символы . Последняя группа просто мало используется в текстовых файлах, и у них нет действительно хорошего текстового представления. Некоторые из них - символы Tab и Newline , где текстовые редакторы уже должны проявить творческий подход к их отображению.

Некоторые текстовые редакторы имеют опции для явного отображения пробелов. Затем они будут фактически нарисованы как символы, в дополнение к их обычному поведению форматирования (которое также является просто интерпретацией этих символов).

Чистый ASCII интерпретирует только 128 значений. Байты, используемые для хранения этой информации, имеют по 256 возможных значений, поэтому половина возможных значений не допускается в ASCII. Например, они используются в специфических для региона наборах символов, таких как Latin 1, но в ASCII они не определены. Они не имеют полезного представления в средстве просмотра текста, которое может обрабатывать только ASCII.


Двоичные данные обычно не интерпретируются как текст. Таким образом, в этих файлах обычно встречаются все возможные значения байтов . Все остальное было бы расточительно (и это причина, по которой вы можете очень хорошо сжимать текст). Форматы графических файлов сложны, и вы обычно не просматриваете их как текст, поэтому они не должны быть читаемыми.

Поскольку не существует единой интерпретации данных (набора символов), которая отображает все возможные значения на читаемые символы, и поскольку это не имеет большого смысла в любом случае (так как это не читаемый текст), основные части отображаются как бессмысленные.


Шестнадцатеричный редактор выбирает другое представление для данных: каждый байт отображается в виде двух шестнадцатеричных цифр. Это просто другое представление, и одно с легко читаемым набором символов: все 256 возможных значений байтов могут быть представлены в виде двух шестнадцатеричных цифр.

Поскольку существует простое отображение двоичных данных в шестнадцатеричное и наоборот (4 двоичных цифры в / из одной шестнадцатеричной цифры), а двоичные данные содержат очень мало информации на одну цифру, шестнадцатеричное обычно является предпочтительным способом для людей читать двоичные данные, если нет особых причины предпочесть другое представление.


Некоторые текстовые редакторы могут иметь режим шестнадцатеричного редактора и некоторую эвристику, которая пытается определить, является ли файл текстовым или двоичным, и автоматически выбирает тот или иной режим. Но это может быть трудно понять правильно, и это не конкретное свойство файла, которое говорит, является ли он одним или другим.


Некоторые FTP-клиенты просят указать, какие окончания файлов используются для текстовых данных . Эти программы будут затем изменить содержимое файла в соответствии с ОС машины вы подключены, как Windows использует другую линию конечной последовательность символов ( CR/LF) , чем Linux и Unix (включая Mac OS X; LF).

Даниэль Бек
источник
4
Тьфу, Л.Ф. укусила меня больше раз, чем я хочу вспомнить.
surfasb
32

Потому что вы открыли его в текстовом редакторе, а не в бинарном редакторе .

Игнасио Васкес-Абрамс
источник
22
Как вы видели, текст.
Игнасио Васкес-Абрамс
1
Текст как представление шестнадцатеричных чисел (0-f), упорядоченных парами (байтами). Если вам нужен двоичный код, преобразуйте шестнадцатеричный код в двоичный в бессмысленной строке из нулей и единиц. Шестнадцатеричный код более понятен человеку и его легче понять.
Fiasco Labs
2
Должен сказать, что: кто-то должен сделать смелый шаг, чтобы выпустить настоящий бинарный редактор с единицами и нулями (и затем, возможно, отдельные панели с соответствующими транслитерациями hex / char / dec) с единственной целью обучения этому виду вещей. Я знаю, что нет, но популярные средства массовой информации и учителя математики, притворяющиеся знакомыми с компьютерами, ошибочно устанавливают все ожидания для нетерпеливых детей, желающих учиться.
ZJR
@ZJR: Нет причин, по которым они не должны. Многие шестнадцатеричные редакторы позволяют просматривать содержимое файла в двоичном формате. Программисты просто не считают его таким полезным, как шестнадцатеричное представление, поэтому вы не слышите об этом слишком много.
Дэвид З
16

Это все связано с контекстом и интерпретацией. В вашем компьютере есть структуры высокого и низкого напряжения или намагниченные области диска, которые приобретают смысл только тогда, когда мы решаем, как мы хотим их интерпретировать.

При других обстоятельствах модель «низкий-высокий-низкий-низкий-низкий-низкий-низкий-низкий-низкий-высокий» может означать число 65, заглавную букву «А», небесно-голубой цвет, что клиент заказал кофе, дату «март». 6-й или что-то вообще, правда.

Когда вы открываете свой файл изображения в графической программе, он знает, как интерпретировать его как изображение, знает, какие шаблоны указывают формат изображения, какие шаблоны указывают размер изображения и так далее.

Когда вы открываете файл изображения в текстовом редакторе, он обрабатывается как текст. Это очень простой формат, гораздо ближе к тому, что на самом деле происходит в компьютере, но все еще существует некоторая интерпретация. В частности, почти каждый шаблон интерпретируется как определенный символ, некоторые нормальные, как AZ, но также и некоторые странные символы. Некоторые шаблоны не отображаются в виде символов, а вместо этого рассматриваются как базовое форматирование: новая строка, табуляция.

(Ситуация немного усложняется такими вещами, как Unicode и текстовыми кодировками, такими как UTF-8, но я не буду иметь дело с ними здесь для простоты.)

Когда у вас есть открытый бинарный файл в текстовом редакторе, будьте осторожны, чтобы не вносить изменения, потому что почти любое внесенное вами изменение полностью нарушит нормальную интерпретацию содержимого файла, то есть разрушит файл и сделает его непригодным для использования.

Эндрю Тернер
источник
3

В качестве упрощенного примера рассмотрим файл изображения, открытый в текстовом редакторе.

Изображение представляет собой простой шахматный рисунок с квадратами шириной 3 пикселя и серой рамкой размером 1 пиксель между каждым квадратом. - три черных пикселя, пиксель серой границы, три белых пикселя, пиксель серой границы, повтор.

Первая строка в этом изображении будет иметь следующее значение четыре раза:

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

(В Hex, а не в Binary - строка в Binary будет в четыре раза длиннее - 0x7F заменяется на 0b01111111)

Если вы загрузите эту строку данных в текстовом редакторе, вы получите следующий текст:

[Нуль] [Нуль] [Нуль] [Нуль] [Нуль] [Нуль] [Нуль] [Нуль] [Нуль] [Del] [Del] [Del] [Пустой] [Пустой] [Пустой] [Пустой] [Пустой ] [Пустой] [Пустой] [Пустой] [Пустой] [Del] [Del] [Del]

Это потому, что 0x00 - это код ASCII для значения Null, и вам нужно записать его 3 раза, чтобы получить значение для черного пикселя (в любом случае, в 24-битном BMP), и у вас есть 3 черных пикселя. Тогда 0x7F - это код ASCII для Delete, и вам нужно ЭТО три раза, чтобы получить серый пиксель. 0xFF не является допустимым кодом ASCII для чего-либо конкретного - даже в расширенном наборе ASCII - и вам нужно написать его 9 раз, чтобы получить 3 белых пикселя. Завершая это, вы получаете еще три удаления, чтобы написать серый пиксель.

Другой способ показать это, который может быть более полезным объяснением, - это обратный пример: что нужно записывать в файл, чтобы получить нули и единицы при открытии в текстовом редакторе?

ASCII-коды для нуля и единицы, конечно! Ноль в текстовом редакторе не сохраняется как один бит со значением 0, он сохраняется как 8 битов со значением 0b00110000 или в шестнадцатеричном формате 0x30

Код ASCII для '0' равен 0x30, а код ASCII для '1' - 0x31, поэтому, если вы хотите сохранить шахматный шаблон как нули и единицы, ваш файл будет выглядеть следующим образом:

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

Это намного больше, чем это - файлы имеют старты и остановки, метаданные и все другие виды вещей, но урок и ответ на ваш вопрос:

Если первые 8 бит вашего файла не равны 0b00110000, ваш текстовый редактор не будет писать «0», потому что это ASCII-код для символа «0». Если первые 8 битов вашего файла не равны 0b00110001, ваш текстовый редактор не будет писать «1», потому что это ASCII-код для символа «1».

Медивх
источник
0

Редактор недостаточно умен, чтобы понять, имеет ли смысл какой-либо текст, поэтому он отображает любой файл в виде текста, если не указано иное, если он имеет такую ​​функцию. Как отмечали другие, некоторые редакторы имеют функцию отображения шестнадцатеричных.

Эмилио М Бумачар
источник
UltraEdit достаточно умен - он переключается в режим редактирования в шестнадцатеричном формате для таких файлов.
Питер Мортенсен