Что такое двоичный файл

Обновлено: 16.05.2024

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

Как компьютеры представляют данные

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

В символьной схеме ASCII один байт (последовательность из восьми единиц или нулей или число от 0 до 255) может быть преобразован в символ. Например, символ «А» — это число 65 в десятичном формате, 41 в шестнадцатеричном формате или 01000001 в двоичном формате. «B» — это десятичное число 66 и т. д. (см. полную таблицу).

Не верите мне? Мини-пример времени.

Создайте в блокноте файл с одной буквой «А» (подойдет любое имя файла — «sample.txt»).

Сохраните файл, щелкните правой кнопкой мыши и посмотрите свойства — он должен быть 1 байт: блокнот хранит символы в ASCII, по одному байту на символ. «Размер на диске» может быть больше, поскольку компьютер выделяет место фиксированными блоками (например, по 4 килобайта).

notepad_A.jpg

notepad_A_size.jpg< бр />

Найдите шестнадцатеричный редактор (вот бесплатный) и откройте только что сохраненный файл. (В Linux/Unix используйте «od -x sample.txt»).

Вы увидите только одно число "41" в шестнадцатеричном формате (65 в десятичном), а шестнадцатеричный редактор может отображать символ "A" на боковом экране (представление байта, который вы проверяете, в ASCII). «0» слева — это адрес байта — программисты любят считать с нуля.

notepad_A_hexedit.PNG

Круто, да? Эти заголовки или «магические числа» — один из способов для программы определить, какой тип файла она видит. Если вы откроете изображение PNG, вы увидите заголовок PNG, который включает буквы ASCII «PNG».

Что происходит?

В памяти компьютера в файле sample.txt хранится только число 65 (41 в шестнадцатеричном формате или 01000001 в двоичном формате). Учитывая контекст информации (например, блокнот ожидает текстовый файл), компьютер знает, что нужно отобразить на экране символ ASCII «A».

Теперь подумайте, как человек запомнит фактическое числовое значение 65, если вы попросите его записать его. Как люди, мы бы написали это как два символа: «6» и затем «5», что занимает 2 символа ASCII или 2 байта (опять же, «буква» 6 может быть сохранена в ASCII).

Компьютер сохранит число "65" как 65 в двоичном формате, как и "а". За исключением этого случая, программное обеспечение будет знать, что «65» — это не код буквы, а сама цифра.

Теперь предположим, что мы хотим сохранить число 4 000 000 000 (4 миллиарда). Как люди, мы бы написали это как 4000000000 или 10 символов ASCII (10 байт). Как это сделает компьютер?

Один байт имеет 8 бит или 2^8 (256) возможных значений. 4 байта дают нам 2^32 бита или примерно 4 миллиарда значений. Таким образом, мы смогли сохранить число 4 миллиарда всего в 4 байтах.

Как видите, хранение числовых данных в формате компьютера позволяет сэкономить место. Это также экономит вычислительные ресурсы — компьютеру не нужно преобразовывать число между двоичным кодом и кодом ASCII.

Итак, почему бы не использовать двоичные форматы?

Если двоичные форматы более эффективны, почему бы не использовать их постоянно?

  • Двоичные файлы трудно читать людям. Когда человек видит последовательность из 4 байтов, он понятия не имеет, что она означает (это может быть 4-буквенное слово, хранящееся в ASCII). Если он увидит 10 букв ASCII 4000000000, он узнает, что это число.
  • Двоичные файлы трудно редактировать. Точно так же, если человек хочет изменить 4 миллиарда на 2 миллиарда, ему нужно знать двоичное представление. В представлении ASCII он может просто поставить «2» вместо «4».
  • С двоичными файлами сложно работать. Традиция UNIX включает в себя несколько простых и элегантных инструментов для работы с текстом.Сохраняя файлы в стандартном текстовом формате, вы получаете всю мощь этих инструментов без необходимости создавать специальные редакторы для изменения двоичного файла.
  • Двоичные файлы могут сбивать с толку. Проблемы возникают, когда компьютеры используют разные способы чтения данных. Существует нечто, называемое «NUXI» или проблема с порядком байтов, которая возникает, когда 2 компьютера с разными архитектурами (например, Mac PowerPC и ПК x86) пытаются передать двоичные данные. Обычный текст, хранящийся в одиночных байтах, однозначен, но будьте осторожны с Юникодом.
  • Прирост эффективности обычно невелик. Представление чисел в двоичном виде может в идеале сэкономить вам коэффициент 3 (четырехбайтовое число может представлять 10 байтов текста). Однако это предполагает, что числа, которые вы представляете, большие (3-значное число, такое как 999, лучше представлено в ASCII, чем в виде 4-байтового числа). Наконец, ASCII на самом деле использует только 7 бит на байт, поэтому вы теоретически упаковываете ASCII вместе, чтобы получить выигрыш в 1/8 или 12%. Однако хранить текст таким образом обычно не стоит хлопот.

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

Упорядочивание и рассортировка данных

Кроме того, Маршаллинг всегда заставляет меня думать о шерифах Маршалах и, следовательно, о ковбоях. Ковбои не имеют ничего общего со значением слова «маршал» в CS.

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

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

Вы можете маршалировать данные в двоичном или текстовом формате — слово «маршалировать» не указывает, как данные хранятся.

Так когда же полезны двоичные форматы файлов?

В некоторых ситуациях может потребоваться использование двоичных форматов файлов. Изображения PNG используют двоичный формат, поскольку при создании небольших файлов изображений важна эффективность. Однако PNG правильно работает с двоичными форматами: он определяет порядок байтов и длину слова, чтобы избежать проблемы NUXI.

Часто использование двоичных форматов связано с бизнесом. Основная причина в том, что их сложнее реконструировать (людям приходится догадываться, как компьютер хранит свои данные), что может помочь сохранить конкурентное преимущество.

Другие сообщения из этой серии

Присоединяйтесь к 450 тысячам читателей в месяц

Понравилась статья? Есть много других вещей, которые помогут вам построить прочное интуитивное понимание математики. Подпишитесь на информационный бюллетень, чтобы получать бонусный контент и последние обновления.

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

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

Что такое двоичный файл?

Двоичный файл — это файл, не содержащий текста. Он используется для хранения данных в виде байтов, которые обычно интерпретируются не как текстовые символы. Эти файлы обычно содержат в своих заголовках инструкции, определяющие, как читать хранящиеся в них данные. Их можно использовать для хранения данных любого типа на компьютере.

form-submission

  • Care Karma подберет для вас лучшие учебные курсы по технологиям
  • Получайте эксклюзивные стипендии и подготовительные курсы

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

Несмотря на то, что все файлы хранят данные одинаково, ваша операционная система обрабатывает их по-разному. Это означает, что хотя звуковой файл и изображение хранятся в файловой системе в виде непрерывных строк данных, изображение нельзя воспроизвести в музыкальном проигрывателе, а музыкальный файл нельзя открыть в программе для просмотра фотографий. Формат файла ограничивает это поведение. Расширения, такие как «.mp3» и «.jpg», прикрепленные к файлам, используются для определения типа данных, которые они должны содержать.

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

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

Двоичный файл против текстового файла

Хотя двоичные и текстовые файлы хранят данные в виде последовательности битов, они сильно отличаются друг от друга. Давайте уделим немного времени, чтобы разобраться в этих двух форматах по отдельности.

Двоичные файлы

В эту категорию попадают все файлы, которые не используются для хранения текстовых данных. Любой пользовательский тип файла может быть создан с использованием двоичного файла, если в файле хранится необходимая информация о том, как читать файл. Эти файлы хранят несколько типов данных, таких как изображения, видео и аудио, в одном файле. Единственное требование, которое они предъявляют, - это наличие в системе подходящей программы для чтения такого рода данных.

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

Найдите подходящий вариант для буткемпа

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

Начните сменить профессию сегодня

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

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

Текстовые файлы

Текстовые файлы можно рассматривать как сокращенную версию двоичных файлов. Они могут хранить только текстовые данные. Все текстовые файлы соответствуют как минимум стандарту ASCII для хранения данных. Текстовые файлы можно просматривать в любом текстовом редакторе. Эта простота просмотра данных делает их менее подверженными непреднамеренному повреждению данных, поскольку любые повреждения легко обнаруживаются текстовыми редакторами.

Текстовые файлы поддерживают несколько форматов для хранения форматированных и простых текстовых данных. Файл TXT хранит неформатированный необработанный текст только с окончаниями строки и файла, в то время как более сложный формат RTF (Rich Text Format) может хранить форматированное текстовое содержимое с такими стилями, как жирный шрифт и курсив. Помимо минимального стандарта кодирования ASCII, современные текстовые файлы поддерживают даже обширные стандарты, такие как UTF (текстовый формат Unicode). Такие стандарты позволяют хранить в текстовых файлах более широкий диапазон символов и легко их читать.

Существуют еще более продвинутые форматы файлов, такие как DOC и DOCX, которые объединяют текстовые и двоичные файлы для удобства пользователей. Например, DOCX — это стандарт, используемый Microsoft Word для хранения текстовых файлов вместе с метаданными, которые помогают лучше просматривать текстовое содержимое в приложении Word. Если вы хотите проверить это сами, попробуйте переименовать файл document.docx в document.docx.zip, а затем откройте его с помощью любого инструмента для распаковки. Вы найдете текстовый файл вместе с несколькими XML-файлами, в которых хранятся метаданные документа.

Преимущества использования двоичных файлов

Двоичные файлы имеют множество преимуществ по сравнению с обычными текстовыми файлами. Давайте посмотрим на некоторые из них:

Эффективность за счет сжатия

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

Более высокая безопасность

Еще раз повторим: настраиваемые двоичные файлы позволяют компаниям создавать собственные стандарты кодирования, которые может быть сложно реконструировать. Чаще всего единственный способ прочитать двоичный файл с пользовательской кодировкой — это угадать, как в нем хранятся данные.

Непревзойденная скорость

Поскольку данные хранятся в необработанном формате и не кодируются с использованием каких-либо стандартов кодирования символов, их быстрее считывают и сохраняют. Это основная причина, по которой хранилища данных для приложений не создаются с использованием простых текстовых файлов.

Проблемы с двоичными файлами

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

Сложно манипулировать

Двоичные файлы не могут быть прочитаны обычными текстовыми процессорами, поэтому их редактирование представляет собой сложную задачу. Чаще всего приложения предпочитают сохранять свои данные с использованием пользовательских схем кодирования. Затем этими данными можно будет манипулировать только внутри приложений с той же схемой кодирования.

Повышение эффективности неравномерно

Хотя хранение данных в двоичном формате может быть быстрым и эффективным в таких форматах, как PNG, другие типы данных могут не получить каких-либо заметных преимуществ в производительности. Хранение текстовых данных добавляет еще одну проблему кодирования и декодирования данных во время просмотра.

Может запутать машины

У компьютеров могут быть разные способы хранения данных и доступа к ним. Когда двоичные данные передаются между двумя компьютерами с разными архитектурами, могут возникнуть такие проблемы, как NUXI. Если компьютер сохраняет «UNIX» в двоичном файле, а файл открывается на другом компьютере с другой архитектурой, он может быть прочитан как «NUXI». Текстовые данные, хранящиеся в TXT или подобных форматах, защищены от таких проблем благодаря наличию таких стандартов, как ASCII.

Где используются двоичные файлы?

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

  • Разработка программного обеспечения. Большинство компиляторов, таких как JVM, создают оптимизированный байт-код из исходного кода для более быстрого выполнения. Пока исходный код хранится в виде текстовых файлов, нет особого смысла хранить аналогичным образом байт-код. Это так, потому что исходный код должен быть просмотрен разработчиком в процессе создания программного обеспечения, а байт-код должен быть прочитан машиной. Машины всегда будут быстрее обрабатывать байты, а не закодированные символы.
  • Обработка изображений. Как упоминалось ранее, большинство форматов изображений, таких как PNG, хранятся в виде двоичных файлов для оптимизации производительности, а также позволяют хранить небольшие файлы изображений. Если бы данные, связанные с файлом фильма, были представлены в виде закодированных символов, стандартный DVD никогда не смог бы сохранить фильм целиком.
  • Разработка игр. Игры требуют большого количества целочисленных и символьных вычислений. Эти числа удобно хранить в виде байтов и оперировать ими, так как кодирование и декодирование 32-битного целого числа значительно увеличивает время процесса.
  • Хранение больших наборов данных. Наборы данных для таких задач, как обучение модели машинного обучения, часто требуется хранить и делать доступными для компьютеров. Хотя хранение набора данных в текстовом файле имеет смысл, так как его легко просматривать, это может привести к проблемам с производительностью компьютера.

Заключение

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

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

Раздел 404 Закона Сарбейнса-Оксли (SOX) требует, чтобы все публичные компании установили внутренний контроль и процедуры.

Закон о защите конфиденциальности детей в Интернете от 1998 года (COPPA) – это федеральный закон, который налагает особые требования на операторов доменов .

План North American Electric Reliability Corporation по защите критически важной инфраструктуры (NERC CIP) представляет собой набор стандартов.

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

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

Метаморфное и полиморфное вредоносное ПО – это два типа вредоносных программ (вредоносных программ), код которых может изменяться по мере их распространения.

Медицинская транскрипция (МТ) – это ручная обработка голосовых сообщений, продиктованных врачами и другими медицинскими работниками.

Электронное отделение интенсивной терапии (eICU) — это форма или модель телемедицины, в которой используются самые современные технологии.

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

Снижение рисков – это стратегия подготовки к угрозам, с которыми сталкивается бизнес, и уменьшения их последствий.

Отказоустойчивая технология — это способность компьютерной системы, электронной системы или сети обеспечивать бесперебойное обслуживание.

Синхронная репликация — это процесс копирования данных по сети хранения, локальной или глобальной сети, поэтому .

API облачного хранилища — это интерфейс прикладного программирования, который соединяет локальное приложение с облачным хранилищем.

Интерфейс управления облачными данными (CDMI) – это международный стандарт, определяющий функциональный интерфейс, используемый приложениями.

Износ флэш-памяти NAND — это пробой оксидного слоя внутри транзисторов с плавающим затвором флэш-памяти NAND.

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

Мы начинаем наше путешествие с двух файлов-кандидатов, содержание которых мы интуитивно классифицируем как "текстовые" и "двоичные" данные соответственно:

Выйти из полноэкранного режима

Мы создали два файла: файл с именем message с текстовым содержимым "hello 🌍" (включая символ Unicode "Глобус Земли Европа-Африка") и изображение PNG с одним белым пикселем. называется белым. Расширения файлов намеренно опущены.

Чтобы продемонстрировать, что некоторые программы различают "текстовые" и "двоичные" файлы, посмотрите, как grep меняет свое поведение:

Выйти из полноэкранного режима

diff делает нечто подобное:

Выйти из полноэкранного режима

Как эти программы различают "текстовые" и "двоичные" файлы?

Прежде чем мы ответим на этот вопрос, давайте сначала попробуем дать определение. Ясно, что на фундаментальном уровне файловой системы каждый файл представляет собой просто набор байтов и, следовательно, может рассматриваться как двоичные данные. С другой стороны, различие между «текстовыми» и «нетекстовыми» (далее: «двоичными») данными кажется полезным для таких программ, как grep или diff , если только не испортить вывод вашего эмулятора терминала.

Может быть, мы можем начать с определения "текстовых" данных. Кажется разумным начать с абстрактного понятия текста как последовательности кодовых точек Unicode. Примерами кодовых точек являются такие символы, как k, ä или א, а также специальные символы, такие как %, ☢ или 🙈. Чтобы сохранить заданный текст в виде последовательности байтов, нам нужно выбрать кодировку. Если мы хотим представить весь диапазон Unicode, мы обычно выбираем UTF-8, иногда UTF-16 или UTF-32. Исторически сложилось так, что кодировки, поддерживающие только часть сегодняшнего Unicode, также важны. Наиболее известными из них являются US-ASCII и Latin1 (ISO 8859-1), но их гораздо больше. И все они выглядят по-разному на уровне байтов.

Учитывая только содержимое файла (а не историю его создания), мы можем попробовать следующее определение:

Файл называется "текстовым файлом", если его содержимое состоит из закодированной последовательности кодовых точек Unicode.

Есть две практические проблемы с этим определением. Во-первых, нам понадобится список всех возможных кодировок. Во-вторых, чтобы проверить, закодировано ли содержимое файла в заданной кодировке, нам нужно будет декодировать все содержимое файла и посмотреть, удастся ли это¹. Весь процесс будет очень медленным.

Оказывается, есть гораздо более быстрый способ отличить текстовые файлы от двоичных, но это достигается ценой точности.

Чтобы увидеть, как это работает, вернемся к двум нашим файлам-кандидатам и изучим их содержимое на уровне байтов. Я использую hexyl в качестве средства просмотра hex, но вы также можете использовать hexdump -C :

Двоичный контент

Обратите внимание, что оба файла содержат байты внутри и вне диапазона ASCII (00 … 7f). Четыре байта f0 9f 8c 8d в файле сообщения, например, представляют собой закодированную UTF-8 версию кодовой точки Unicode U+1F30D (🌍). С другой стороны, байты 50 4e 47 в начале белого изображения представляют собой простую версию символов PNG ² в кодировке ASCII.

Очевидно, что просмотр байтов за пределами диапазона ASCII не может использоваться в качестве метода обнаружения "двоичных" файлов. Однако между этими двумя файлами есть разница. Файл изображения содержит много байтов NULL (00), а короткое текстовое сообщение — нет.Оказывается, это можно превратить в простой эвристический метод для обнаружения двоичных файлов, поскольку многие закодированные текстовые данные не содержат NULL-байтов (хотя это может быть допустимо).

На самом деле это именно то, что diff и grep используют для обнаружения "двоичных" файлов. Следующий макрос включен в исходный код diff ( src/io.c ):

Выйти из полноэкранного режима

Здесь функция memchr(const void *s, int c, size_t n) используется для поиска символа 0 в байтах начального размера области памяти, начиная с buf. Чтобы еще больше ускорить этот процесс, обычно в буфер buf считываются только первые несколько байтов файла (например, 1024 байта). Подводя итог, grep и diff используют следующий эвристический подход:

Файл, скорее всего, будет "текстовым файлом", если первые 1024 байта его содержимого не содержат NULL-байтов.

Выйти из полноэкранного режима

Тем не менее, этот эвристический подход очень полезен. Я написал небольшую библиотеку на Rust, которая использует слегка усовершенствованную версию этого метода, чтобы быстро определить, содержит ли данный файл «двоичные» или «текстовые» данные. Он используется в моей программе bat для предотвращения сброса «бинарных» файлов на терминал:

bat, обнаружение двоичных файлов

Сноски


¹ Обратите внимание, что в некоторых кодировках в начале файла записываются так называемые метки порядка следования байтов (BOM) для указания типа кодировки. Например, вариант UTF-32 с прямым порядком байтов использует ff fe 00 00 . Эти спецификации помогут со вторым пунктом, потому что нам не нужно будет декодировать все содержимое файла. К сожалению, добавление спецификаций не является обязательным, и во многих кодировках они не указаны.


² 50 4e 47 является частью магического числа формата PNG. Магические числа аналогичны спецификациям, и многие двоичные форматы используют магические числа в начале файла для обозначения своего типа. Использование магических чисел для обнаружения определенных типов «двоичных» файлов — это метод, который используется файловым инструментом.

Читайте также: