Как конвертировать файл в бинарное содержимое

Обновлено: 03.07.2024

Работа с бинарными файлами — традиционная тема при обучении программированию — по меньшей мере, в России. Не последнюю роль здесь играет широкое распространение в российских школах языка программирования Pascal, который имеет встроенную поддержку работы с так называемыми типизированными файлами (типы file of integer , file of real и т. п.). В некоторых случаях (при углублённом изучении программирования у школьников или на младших курсах университета), когда начинается изучение языка C++, возникает желание решать задачи на обработку «файлов типа T» уже в новом окружении данного языка. И тут возникает вопрос, какие средства при этом использовать.

К сожалению, для работы с бинарными файлами в языке C++ предусмотрены только низкоуровневые средства — методы read / write стандартных типов потоков istream / ostream . Кроме других очевидных недостатков этот факт не даёт использовать в полную силу программирование «в стиле STL» (то есть, в первую очередь, часть стандартной библиотеки C++, связанную с алгоритмами и итераторами).

Итак, задача состоит в том, чтобы обеспечить работу с бинарными файлами, хранящими последовательность значений типа T , как с последовательностью STL ( vector<T> и т. п.). Для T подразумеваются значения базовых типов, а также, так называемые POD-типы (везде дальше можно думать только о базовых типах, если вы не знакомы с понятием POD).

Возможные решения

Если вы никогда не встречались с подобной задачей (что было бы странно!), возможно, вы вспомните что-то про флаг ios_base::binary , но те, кто встречался, хорошо знает, что данное средство практически никак не поможет в решении. Стандарт языка предельно краток на тему того, какого эффекта можно ожидать от указания данного флага при открытии потока, но в сети можно встретить пояснение, что он просто отключает платформенно-зависимые трансляции символов перехода на новые строки и, возможно, ещё некоторых символов, что не имеет прямого отношения к нашей задаче.

Вероятно, люди, знающие стандартную библиотеку чуть глубже, чем на базовом уровне, помнят, что стандартные типы для файловых потоков ofstream / ifstream являются синонимами для явных инстанций шаблонов basic_ofstream / basic_ifstream . Эти шаблоны имеют два аналогичных типовых параметра: тип символов потока (назовём этот параметр Ch ) и тип характеристик типа символов — по умолчанию это std::char_traits<Ch> . Для ofstream / ifstream в качестве Ch взят тип char .

Здесь немедленно возникает мысль попробовать инстанцировать эти шаблоны с тем типом T , который мы хотим читать из бинарного файла, указав его в качестве значения шаблонного параметра Ch . Простейший код, пытающийся читать из потока такого типа значения типа int падает с исключением времени выполнения bad_cast . Возможно, что-то можно было бы изменить, написав свою специализацию для char_traits<int> и передав её вторым параметром шаблону класса файлового потока, однако этот путь показался беспеперспективным (писать специализацию весьма обширного шаблона char_traits для каждого типа T …) и я не стал разбираться с ним далее.

После первых неудач можно прийти к мысли, что получить нужное поведение «совсем бесплатно» из стандартных средств не получится и придётся написать кое-какой код. Попробуем решить эту задачу в парадигме ООП, то есть написав пару-другую своих классов. Классов потоков, естественно. Отнаследоваться у стандартных ofstream / ifstream , сохранив максимум определений из предков, и посмотреть, что получится. (В скобках замечу, что задача эта сама по себе не лишена смысла хотя бы ввиду того, что отмечена довольно высоким рейтингом сложности в списке упражнений из книги Б. Страуструпа — упр. 15, п. 21.10 в третьем и специальном изданиях книги «Язык программирования C++».)

С самого начала очевидной была необходимость перегрузки операций << и >> для своих классов потоков. Казалось, этого будет достаточно. Проблема возникла в следующем. Чтобы работать с потоком с помощью алгоритмов стандартной библиотеки, следует использовать итераторы ввода/вывода. По заявлениям авторов STL её средства все из себя обобщённые и я ожидал, что как только мой класс потока будет удовлетворять некоторым неявным требованиям библиотеки, она с радостью заработает с ним — статический полиморфизм… В частности, я ожидал, что стандартные итераторы параметризованы типом потока, с которым они работают. Не тут-то было! В определении шаблонов итераторов ввода/вывода жёстко зашиты стандартные типы basic_ofstream / basic_ifstream .

Надежда на спасение на этом пути остаётся, если обратить внимание на одну особенность реализации операций << и >> : для базовых типов они реализованы как функции-члены шаблонов классов потоков. Если бы они, кроме того, были объявлены виртуальными, то можно было бы положиться на динамический полиморфизм (стандартные итераторы хранили бы объекты моих потоков по ссылке на базовый класс) — получилось бы частичное решение исходной задачи, работавшее только для базовых типов (int, double и т. п.). Однако указанные функции-члены не являются виртуальными. Тут можно было бы порассуждать о логике устройства стандартной библиотеки или отсутствии таковой (например, известно, что для STL изначально не предполагалось использования всей мощи ООП, наследования и полиморфизма, но ведь потоковая библиотека построена на ООП…), однако перейдём к финальному решению.

Ad-hoc полиморфизм (перегрузка): win

В конце концов, всё, что требуется — вызывать специальные версии операций << и >> , которые бы прятали низкоуровневую работу с файлами посредством read / write . Достаточно предоставить свою перегрузку этих операций и позаботиться о том, чтобы вызывалась именно она. Достичь этого можно использованием специальных типов в аргументах. Манипулировать типами потоков у нас уже не получилось — остаётся придумать специальные типы для вводимого/выводимого. Здесь напрашивается использование того, что называется «обёртками».

К счастью, нам нет нужны писать новые классы обёрток для разных типов T : можно ограничиться одним шаблоном класса, хранящим поле параметра-типа T и умеющего преобразовываться к ссылке на это поле — константной и неконстантной. Конструктор с одним параметром типа T , который не объявлен как explicit , позволит неявно преобразовывать значения типа T к типу-обёртке. Конструктор без параметров — требование STL. Результирующий код приведён ниже.

Использование static_cast требует от компилятора вызвать определённую в теле шаблона класса операцию приведения типа для получения ссылки на информационное поле, а reinterpret_cast приводит адрес этого поля к указателю на char , готовя нас к низкоуровневой работе с read / write .

Вот пример, демонстрирующий использование обёртки. Он несёт на себе отпечаток тех идей, которые закладывались изначально, а именно, программирование в стиле STL.

Заключение

Понятно, что в результате получился «абсолютный велосипед», который, наверное, писался многими программистами на C++, однако в сети или в каких-то известных библиотеках (например, Boost, в частности, Boost.Iostreams) подобного я не заметил.

Ещё я хотел бы отметить, что намерено оставил за скобками обсуждение актуальности поставленной задачи. Наверное, есть люди, не представляющие работу с файлами на более высоком, чем read / write , уровне. Возможно, найдутся те, кто скажет, что бинарные файлы это прошлое, что они жутко непереносимы или что-то похожее. Может быть, отчасти это так, однако само упражнение в решении такой задачи мне показалось интересным и познавательным.

За постановку задачи и обсуждение решения я искренне благодарю Виталия Николаевича Брагилевского.

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


Формат файлов BIN – особенный. В отличие от других, он способен содержать в себе самые разнообразные данные. Давайте разберемся, что может находиться в БИН-файлах, и рассмотрим способы их открытия.

Что представляет собой формат BIN

Расширение .bin — это сокращение от слова binary, что означает «двоичный» (код). Объект такого типа может представлять собой исполняемый системный файл, БИОС игровой приставки, прошивку роутера или телефона Андроид и даже обычное видео- или аудиозапись. Но чаще всего пользователи встречаются с файлами БИН в виде образов дисков, подобных образам ISO, IMG и т.д.

Программы для открытия BIN файлов

Предположить, что перед вами бинарный файл образа диска, можно по его размеру. Например, образы дистрибутивов операционных систем «весят» 1-2 Gb и больше, образы CD/DVD/Blu-ray дисков – от десятков Mb до нескольких Gb и т. д.

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

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

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

UltraISO

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

Программа UltraISO способна производить следующие действия с бинарными образами:

  • редактирование образа;
  • конвертирование в другой формат;
  • извлечение вложенных файлов;
  • создание БИН-а из файлов с жесткого диска;
  • монтирование в виртуальный привод.

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

Чтобы открыть БИН при помощи UltraISO, сделайте следующее:

Программа UltraISO платная, в пробной версии имеется ограничение на открытие файлов размером более 300 Mb. Чтобы его убрать, придется приобрести полную версию за $29.95 долларов.

Daemon Tools Lite

Daemon Tools — еще одна популярная программа, которая умеет работать с образами дисков. Ее интерфейс достаточно прост, и разобраться в нем несложно без инструкции.

Если хотите, чтобы Daemon Tools открывал образы BIN по умолчанию, при установке приложения отметьте этот формат, как на скриншоте ниже:

форматы поддерживаемые Daemon Tools

С помощью Daemon Tools вы сможете:

  • монтировать образы в виртуальный привод;
  • просматривать и извлекать из них файлы;
  • редактировать содержимое бинарного архива (в платных версиях).
  • конвертировать в другой формат (в платных версиях).

Чтобы открыть БИН при помощи Daemon Tools, запустите программу и сделайте следующее:

В отличие от UltraISO, программа Daemon Tools Lite не загружает образ в себя, а монтирует его в виртуальный привод. Содержимое последнего открывается в проводнике Windows 7 или Windows 10 как обычная папка или диск.

Daemon Tools имеет одну бесплатную (Lite) и несколько платных версий с дополнительным функционалом – Lite Personal, Ultra и Pro. Помимо перечисленного выше, они добавляют к базовому функционалу возможность записывать диски с данными и музыкой, создавать виртуальные жесткие диски, эмулировать IDE-приводы и многое другое. Цены на платные версии варьируются от $19 до $40.

Power ISO

Приложение PowerISO также умеет работать с различными типами образов дисков, в том числе распаковать архивы BIN. По интерфейсу и функционалу оно похоже на UltraISO, но, как и Daemon Tools, имеет бесплатную и платные версии.

Power ISO позволяет производить с БИН файлами следующие действия:

  • редактирование и извлечение содержимого;
  • создание образов из файлов с жесткого диска;
  • монтирование в виртуальный привод;
  • конвертирование в другой формат.

Чтобы открыть БИН с помощью Power ISO, сделайте следующее:

Бесплатная версия Power ISO имеет ограничение на размер открываемого файла в 300 Mb. Цена платной версии составляет $29.95 долларов.

Открыть BIN на компьютере также можно и при помощи других приложений для работы с образами дисков, таких, как Alcohol 120%, MagicISO, Hex to Bin Utility, Roxio Creator, Nero Burning ROM и т. д.

Другие виды бинарных файлов

Помимо образов дисков, файлы бинарного формата могут быть прошивками устройств, данными игр, видео- или аудиозаписями и многим другим. Рассмотрим несколько самых распространенных после образов типов БИН-файлов в подробностях.

Исполняемый двоичный файл

Исполняемый файл — это часть какого-либо приложения в двоичном виде. Он может содержать в себе данные для запуска программы или её настройки.

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

Некоторые из файлов этого типа можно открыть при помощи приложения Apache OpenOffice, которое работает на компьютерах с операционной системой Windows, Mac OS и Linux.

Исполняемый файл Unix

Файлы двоичного формата в операционных системах Unix – это обычные приложения. Они предназначены для использования в дистрибутивах Linux, FreeBSD и т. д.

Файл прошивки маршрутизатора

Фирмы Linksys, D-Link, ZyXEL, TP-Link, Huawei используют в своих роутерах прошивки в формате БИН. Прошивка – это программа, которая управляет работой устройства.

Для работы с файлами прошивок используются собственные приложения производителей роутеров для различных платформ (Windows, Mac, Android и т. д.), а также веб-сервисы.

Архив Macbinary II

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

Файл обновления конфигураций устройств BlackBerry

Программный пакет BlackBerry Enterprise Server содержит в себе приложение IT Policy Manager, одним из компонентов которого является файл policy.bin. Он содержит в себе данные настроек и используется системными администраторами для обновления программного обеспечения BlackBerry.

Policy.bin можно открыть при помощи программы Research In Motion BlackBerry Desktop Manager.

Файл игр приставки Nintendo DS

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

Открыть файл БИН этого типа можно при помощи следующих программ:

Файл игры Atari

БИН-файл игры Atari содержит в себе образ картриджа для одноименных консолей, которые были популярны в 80-ых годах. Файл используется для загрузки игр в эмулятор приставки, открыть его можно при помощи следующих приложений:

Файл данных Nintendo Wii

Файл данных Nintendo Wii может содержать в себе зашифрованные или обычные текстовые сведения об игре для одноименной игровой консоли. Обычно он хранится на SD-карте устройства и имеет название content.bin. Увидеть, что находится в этом файле, можно при помощи программных инструментов самой приставки.

Образ игры Sega Genesis

Бинарник Sega Genesis – это образ картриджа с игрой для консоли Sega Genesis. На компьютере он открывается при помощи эмуляторов.

BIOSPlayStation

БИН файлы BIOS PlayStation также могут открываться в эмуляторах одноименной консоли на компьютере. Они предназначены для обеспечения работы устройства.

Программы для открытия файлов BIOS PlayStation в Windows, Mac OS и Linux:

Бинарный видео- или аудиофайл

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

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

Эксперимент с бинарным файлом на языке Python

Чтобы понять, как работать с файлами в бинарном формате проведем несколько экспериментов. Рассмотрим в начале файл, состоящий из текстовых строк и посмотрим результат чтения его в бинарном формате. Вот этот файл ( file1 )

1234
qwer
абсд

Программа p400.py считывает файл в строку h и далее мы печатаем эту строку обычной функцией print() . В результате на консоль выводится следующее:

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

Файл, как числовой список в языке Python

Теперь посмотрим, как можно получить содержимое файла в виду массива чисел ( p400a.py ).

Результат выполнения программы p400a.py:

49 50 51 52 10 113 119 101 114 10 208 176 208 177 209 129 208 180 10 10

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

Обратно к текстовому файлу на языке Python

Ну и последнее, что хотелось бы сегодня рассказать о бинарных файлах (а это не последний урок), как полученную последовательность чисел опять превратить в файл. Смотрим программу p400b.py .

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

1234
qwer
абсд

т.е. копию первоначального файла. Обращаю внимание на массив bytes , который использовался нами для записи в файл.

На сегодня о бинарных файлах все. Но продолжение следует. Следующая статья здесь .

Пока! Программируем на Python и подписываемся на мой канал Old Programmer .

В данной теме показано как можно сохранять данные в бинарных файлах без использования стандартных средств pickle или struct языка Python.

Содержание

  • 1. Понятие о бинарных файлах. Представление информации в бинарных файлах
  • 2. Запись/чтение списка, который содержит вещественные числа. Пример
  • 3. Запись/чтение кортежа, содержащего строки символов. Пример
  • 4. Запись/чтение множества, содержащего вещественные числа. Пример
  • 5. Запись/чтение двумерной матрицы строк заданного размера. Пример
  • 6. Запись/чтение словаря. Пример
  • 7. Копирование одного бинарного файла в другой
  • 8. Объединение двух бинарных файлов

Поиск на других ресурсах:

1. Понятие о бинарных файлах. Представление информации в бинарных файлах

В языке Python существуют средства для работы с бинарными или двоичными файлами. Бинарные файлы используют строки типа bytes . Это значит при чтении бинарных данных из файла возвращается объект типа bytes .

Пример, демонстрирующий особенности представления информации в бинарных файлах.

Результат работы программы

На основании примера выше можно сделать следующие выводы:

2. Запись/чтение списка, который содержит вещественные числа. Пример

Результат работы программы

3. Запись/чтение кортежа, содержащего строки символов. Пример

Результат работы программы

4. Запись/чтение множества, содержащего вещественные числа. Пример

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

Результат работы программы

Вид файла myfile6.bin

5. Запись/чтение двумерной матрицы строк заданного размера. Пример

В примере матрица представлена в виде списка.

Результат работы программы

Вид файла myfile7.txt

6. Запись/чтение словаря. Пример

Пусть задан некоторый словарь, который нужно записать в бинарный файл.

Результат работы программы

Вид файла myfile8.txt

7. Копирование одного бинарного файла в другой
8. Объединение двух бинарных файлов. Пример

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

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