Что такое бинарный файл

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

Но бинарные форматы имеют еще одно очень важное преимущество, однако не технологическое, а маркетинговое. Преимущество состоит в том, что если формат файла не описан, то понять его самостоятельно довольно трудно. Это преимущество можно использовать в войне за рынок. Предположим, что какая-то фирма (для определенности назовем ее M) выпускает программу (W), использующую двоичный формат файлов (d), спецификации которого не публикуются. Если эта фирма сможет занят лидирующее или монопольное положение на рынке, то конкурентам будет довольно тяжело ее потеснить. Если какая-то другая фирма (S) или организация (O) попытается выйти на рынок с программой (OO) аналогичного назначения, то для пользователей буду не так важны преимущества OO перед W, как умение OO обрабатывать файлы формата d. Т.е. использование закрытого двоичного формата позволяет нам более уверенно контролировать ситуацию на рынке, т.к. конкуренты должны будут разгадать наш хитрый формат. А на них можно будет еще и в суд подать :). Правда пользователи нашей программы должны будут мириться с ее глюками, исправлять которые сможем только мы. Но мы ведь деньги зарабатываем, а не занимаемся благотворительностью 🙂

Самый большой недостаток двоичных файлов — их непереносимость. Мало того, что на разных платформах одни и те же типы данных (например int в языке C) могут иметь разные размеры (2 или 4 байта, к примеру), так еще и порядок байт в слове может быть различным (big-endian и little-endian). Поэтому двоичный файл, созданный на PC неправильно прочитается на Mac. По этой причине в стандартах двоичных файлов всегда оговаривается порядок байтов. Хорошо еще, что сейчас размер байта на всех платформах уже одинаков.

Еще одна проблема связана с так называемым выравниванием. Дело в том, что на некоторых платформах данные должны располагаться по определенным адресам (например, по четным) или рекомендуется их располагать по определенным адресам для более быстрой обработки. Компиляторы могут автоматически выполнять выравнивание. Поэтому, если Вы записываете в файл двоичный образ записи, имеющей размер 3 байта, компилятор вправе записать в файл 4 байта. Естественно, что для правильной обработки программа- читатель должна использовать тот же тип выравнивания, что и программа-писатель.

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

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

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

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

Именно из-за этих преимуществ все стандарты или протоколы передачи информации в Internet (http, smtp, pop и т.д.) являются текстовыми.

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

Если для каждого формата двоичного файла необходима отдельная программа, которая в состоянии его обработать, то для манипуляций с содержимым любых текстовых файлов можно использовать хорошо известные и проверенные временем (каков слог 🙂 инструменты: grep, sed, awk, не говоря о таких монстрах как Perl.

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

XML

XML (eXtensible Marckup Language, расширяемый язык разметки) — это язык для описания сложных документов. XML разрабатывался как язык, более универсальный, чем HTML и лишенный его недостатков. Есть мрачная шутка, что этот язык объединяет непонятность двоичных форматов и сложность обработки текстовых. Конечно, на самом деле не все так печально. На основе XML можно разрабатывать специализированные языки. Поэтому этот язык в настоящее время очень популярен. Практически все программы переходят на его использование. Например, Open Office для хранения документов использует именно формат на основе XML. В настоящее время разрабатывается стандартный формат хранения офисных документов также на основе XML.

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

Заключение

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

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

Если же переносимость и простота обработки — более важные требования, то следует обратить внимание на текстовый формат и XML.

Copyleft, 2005 Vadim A. Khohlov aka xvadim (xvadim AT newmail.ru)

5.2. Работа с бинарными файлами

Следует отметить, что во всех рассмотренных выше примерах функция fopen() в режимах “r” и “w” открывает текстовый файл на чтение и запись соответственно. Это означает, что некоторые символы форматирования текста, например возврат каретки ‘\r’ не могут быть считаны как отдельные символы, их как бы не существует в файле, но при этом они там есть. Это особенность текстового режима файла. Для более «тонкой» работы с содержимом файлов существует бинарный режим, который представляет содержимое файла как последовательность байтов где все возможные управляющие коды являются просто числами. Именно в этом режиме возможно удаление или добавление управляющих символов недоступных в текстовом режиме. Для того чтобы открыть файл в бинарном режиме используется также функция fopen() с последним параметром равным “rb” и “wb” соответственно для чтения и записи.

Как прочитать бинарный файл

Продемонстрируем особенности обработки бинарного файла на примере подсчета числа управляющих символов возврата каретки ‘\r’ в файле, открытый в текстовом режиме и бинарном.

Результат работы будет следующий:

Анализ полученных данных показывает, что при открытии файла в текстовом режиме, символы возврата каретки ‘\r’ не считываются функцией getc(), а в бинарном режиме доступны все символы.

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

Для работы с бинарными файлами предусмотрены функции fread() и fwrite() со следующим синтаксисом:

где *buffer – указатель на буфер памяти, в который будут считываться данные из файла; size – размер элемента в байтах; count — число считываний элементов; *stream – указатель на файл.

где *buffer – указатель на буфер памяти, из которого будут считываться данные в файл; size – размер элемента в байтах; count — число записей; *stream – указатель на файл.

Приведем пример использования функций fwrite() и fread().

В данном примере массив list выступает в качестве буфера для вывода и ввода информации из бинарного файла. Сначала элементы буфера инициализируются буквами латинского алфавита от z до b, а затем записываются в файл с помощью функции fwrite( list, sizeof( char ), 25, stream ). Здесь оператор sizeof( char ) указывает размер элемента (буквы), а число 25 соответствует числу записываемых букв. Аналогичным образом осуществляется считывание информации из файла fread( list, sizeof( char ), 25, stream ), где в массив list помещаются 25 символов, хранящихся в файле.

Функции fwrite() и fread() удобно использовать при сохранении данных структуры в файл. Запишем пример хранения информации по двум книгам в бинарном файле.

В данном примере с помощью функции fwrite() целиком сохраняется массив books, состоящий из двух элементов, а оператор sizeof(books) определяет размер массива books.

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

Следует отметить, что функция fopen() при открытии файла на запись уничтожает все данные из этого файла, если они были. Вместе с тем существует необходимость добавлять данные в файл, не уничтожая ранее записанную информацию. Это достигается путем открытия файла на добавление информации. В этом случае функции fopen() третьим аргументом передается строка “a” или “ab”, что означает открыть файл на добавление информации в его конец. Продемонстрируем работу данного режима на следующем примере.

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

Когда стандартные функции возвращают EOF, это обычно означает, что они достигли конца файла. Однако это также может означать ошибку ввода информации из файла. Для того чтобы различить эти две ситуации в языке С++ существую функции feof() и ferror(). Функция feof() возвращает значение отличное от нуля, если достигнут конец файла и нуль в противном случае. Функция ferror() возвращает ненулевое значение, если произошла ошибка чтения или записи, и нуль – в противном случае. Пример использования данных функций представлен в листинге 5.10.

В языке С++ имеются также функции remove() и rename() для удаления и переименования файлов. Их синтаксис следующий:

где *path – путь с именем удаляемого файла. Данная функция определена в библиотеках stdio.h и io.h, возвращает нуль при успешном удалении и -1 в противном случае.

где *oldname – имя файла для переименования; *newname – новое имя файла. Данная функция определена в библиотеках stdio.h и io.h, возвращает нуль при успешном удалении и не нуль в противном случае.


На заре своего появления ПЛК имели только бинарные входы, т. е. входы, значения сигналов на которых способны принимать только два состояния — логического нуля и логической единицы.
Так, наличие тока (или напряжения) в цепи входа считается обычно логической единицей.

Бинарный файл

Отсутствие тока (напряжения) означает логический 0. Датчиками, формирующими такой сигнал, являются кнопки ручного управления, концевые датчики, датчики движения, контактные термометры и многие другие.
Бинарный выход также имеет два состояния — включен и выключен. Сфера применения бинарных выходов очевидна: электромагнитные реле, силовые пускатели, электромагнитные клапаны, световые сигнализаторы и т. д.

В сфере применения ПЛК бинарные входы и выходы называют обычно дискретными. Хотя, конечно, это не точно. Аналоговые сигналы в ПЛК обязательно преобразуются в цифровую, т. е. заведомо дискретную форму представления. Но в технических документах ПЛК любой фирмы вы встретите именно указание количества дискретных и аналоговых входов. Поэтому и далее в книге мы сохраним устоявшуюся здесь терминологию.
[Петров И. В. Программируемые контроллеры. Стандартные языки и приемы прикладного проектирования]

Параллельные тексты EN-RU

Binary input

The P63x has opto-coupler inputs for processing binary signals from the substation.

The number and connection schemes for the available binary signal inputs are shown in the terminal connection diagrams.

The configuration options for all binary inputs can be displayed in the support software.

The P63x identifies the installed modules during startup.

If a given binary I/O module is not installed or has fewer binary signal inputs than the maximum number possible at this slot, then the configuration addresses for the missing binary signal inputs are automatically hidden in the menu tree.

When configuring binary inputs, one should keep in mind that the same function can be assigned to several signal inputs.

Thus one function can be activated from several control points having different signal voltages.

In order to ensure that the device will recognize the input signals, the triggering signals must persist for at least 30 ms.

The operating mode for each binary signal input can be defined.

The user can specify whether the presence (active 'high' mode) or absence (active 'low' mode) of a voltage shall be interpreted as the logic '1' signal.

[Schneider Electric]

Двоичный вход

Устройство P63x имеет оптоизолированные входы на которые поступают двоичные сигналы от подстанции.

Количество и способ подключения двоичных входов указаны в схемах подключения.

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

Устройство P63x определяет установленные модули во время автозагрузки.

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

При конфигурировании двоичных входов следует иметь в виду, что нескольким двоичным входам можно присвоить одну и ту же функцию.

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

Чтобы входные сигналы были распознаны устройством, их длительность должна быть не менее 30 мс.

Для каждого двоичного входа можно определить свой режим работы.

Можно указать, какой сигнал двоичный вход будет интерпретировать как логическую единицу:  высокий уровень напряжения (active 'high' mode) или низкий уровень напряжения (active 'low' mode).

[Перевод Интент]

Двоичный (бинарный) файл — в широком смысле: последовательность произвольных байтов.

что такое бинарный файл?

Название связано с тем, что байты состоят из бит, то есть двоичных (англ. binary) цифр.

В узком смысле слова двоичные файлы противопоставляются текстовым файлам. При этом с точки зрения технической реализации на уровне аппаратуры, текстовые файлы являются частным случаем двоичных файлов, и, таким образом, в широком значении слова под определение «двоичный файл» подходит любой файл.

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

Визуализация

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

 октетов   кол-во бит   шестнадцатеричное   восьмеричное  десятичное
 беззнаковое 
десятичное
знаковое
1 8 00

FF
000

377
0

255
-128

127
2 16 0000

FFFF
000000

177777
0

65535
-32768

32767
4 32 00000000

FFFFFFFF
00000000000

37777777777
0

4294967295
-2147483648

2147483647

Нередко, помимо числовых значений байт, выводятся также символыкодовой страницы, например ASCII. Нижеследующий пример показывает т. н. классический дамп (пооктетное шестнадцатеричное представление по 16 байт в строке, с печатными ASCII-символами справа) начала PNG-файла логотипа Википедии:

00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG……..IHDR| 00000010 00 00 00 87 00 00 00 a0 08 03 00 00 00 11 90 8f |…………….| 00000020 b6 00 00 00 04 67 41 4d 41 00 00 d6 d8 d4 4f 58 |…..gAMA…..OX| 00000030 32 00 00 00 19 74 45 58 74 53 6f 66 74 77 61 72 |2….tEXtSoftwar| 00000040 65 00 41 64 6f 62 65 20 49 6d 61 67 65 52 65 61 |e.Adobe ImageRea| 00000050 64 79 71 c9 65 3c 00 00 03 00 50 4c 54 45 22 22 |dyq.e<….PLTE»»| 00000060 22 56 56 56 47 47 47 33 33 33 30 30 30 42 42 42 |»VVVGGG333000BBB| 00000070 4b 4b 4b 40 40 40 15 15 15 4f 4f 4f 2c 2c 2c 3c |KKK@@@…OOO,,,<| 00000080 3c 3c 3e 3e 3e 3a 39 39 04 04 04 1d 1d 1d 35 35 |<<>>>:99……55| 00000090 35 51 50 50 37 37 37 11 11 11 25 25 25 0d 0d 0d |5QPP777…%%%…| 000000a0 27 27 27 1a 1a 1a 38 38 38 2a 2a 2a 08 08 08 20 |»’…888**… | 000000b0 20 20 17 17 17 2e 2e 2e 13 13 13 bb bb bb 88 88 | …………..|

Инструменты

Для визуализации

Для редактирования

  • HEX-редактор
    • beye (для всех операционных систем, свободная программа)
    • hiew (для DOS, Microsoft Windows, Windows NT)
    • WinHex (для Windows)

Литература

  • Webster’s New World Dictionary of Computer Terms, 4th. Ed, Prentice Hall, NY, 1992. ISBN 0-671-84651-5
  • Леонтьев Б. К. Форматы файлов Microsoft Windows XP: Справочник, М.: ЗАО «Новый издательский дом», 2005. ISBN 5-9643-0059-6

См. также

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *