Почему вы не видите двоичный код при открытии двоичного файла в текстовом редакторе? Например, когда я открываю изображение в текстовом редакторе, я вижу некоторые странные символы, а также некоторые читаемые человеком символы; но изображение должно быть закодировано в двоичном виде.
5 ответов
Двоичные и текстовые данные не разделены: это просто данные. Это зависит от интерпретации, которая делает их одним или другим. Если вы откроете двоичные данные (например, файл изображения) в текстовом редакторе, большая часть этого не будет иметь смысла, поскольку она не соответствует выбранной вами интерпретации (как текст).
То, что вы называете текстом, является подмножеством возможного содержимого файла: Данные, которые в данном наборе символов преобразуются в читаемые символы.
Например, в 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
).
Потому что вы открыли его в текстовом редакторе, а не в бинарном редакторе.
Это все связано с контекстом и интерпретацией. В вашем компьютере есть структуры высокого и низкого напряжения или намагниченные участки диска, которые приобретают смысл только тогда, когда мы решаем, как мы хотим их интерпретировать.
При других обстоятельствах модель «низкий-высокий-низкий-низкий-низкий-низкий-низкий-низкий-низкий-высокий» может означать число 65, заглавную букву «А», небесно-голубой цвет, что клиент заказал кофе, дату «март». 6-й или что-то вообще, правда.
Когда вы открываете свой файл изображения в графической программе, он знает, как интерпретировать его как изображение, знает, какие шаблоны указывают формат изображения, какие шаблоны указывают размер изображения и так далее.
Когда вы открываете файл изображения в текстовом редакторе, он обрабатывается как текст. Это очень простой формат, гораздо ближе к тому, что на самом деле происходит в компьютере, но все еще существует некоторая интерпретация. В частности, почти каждый шаблон интерпретируется как определенный символ, некоторые нормальные, как AZ, но также и некоторые странные символы. Некоторые шаблоны не отображаются в виде символов, а вместо этого рассматриваются как базовое форматирование: новая строка, табуляция.
(Ситуация несколько усложняется такими вещами, как Unicode и текстовыми кодировками, такими как UTF-8, но я не буду иметь дело с ними здесь для простоты.)
Когда у вас открыт бинарный файл в текстовом редакторе, будьте осторожны, чтобы не вносить изменения, потому что почти любое внесенное вами изменение полностью нарушит нормальную интерпретацию содержимого файла, то есть разрушит файл и сделает его непригодным для использования.
В качестве упрощенного примера рассмотрим файл изображения, открытый в текстовом редакторе.
Изображение представляет собой простой шахматный рисунок с квадратами шириной 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».
Редактор недостаточно умен, чтобы понять, имеет ли смысл какой-либо текст, поэтому он отображает любой файл в виде текста, если не указано иное, если он имеет такую функцию. Как отмечали другие, некоторые редакторы имеют функцию отображения шестнадцатеричных.