Как декодировать бинарный файл python

Обновлено: 08.07.2024

В данной теме показано как можно сохранять данные в бинарных файлах без использования стандартных средств 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. Объединение двух бинарных файлов. Пример

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

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

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

Подготовка

Перед тем, как начать урок, желательно создать один или несколько бинарных файлов, чтобы воспользоваться скриптом из примера. Ниже представлены два скрипта на Python, которые создадут два бинарника. Файл binary1.py создаёт string.bin, содержащий строковые данные, а binary2.py – number_list.bin со списком из числовых данных.

Binary1.py

Binary2.py

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

В Python существует множество способов прочитать бинарный файл. Можно прочитать определённое количество байтов или весь файл сразу.

Результат

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


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

Следующий скрипт поможет нам прочитать бинарник number_list.bin, созданный нами ранее.

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

Результат

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


Читаем бинарный файл с помощью NumPy

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

Функция tofile() создаёт текстовый или бинарный файл, а fromfile() считывает данные из файла и создаёт массив.

Синтаксис tofile()

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

Синтаксис fromfile()

Первый аргумент обязательный – он принимает имя файла, путь или строку. Содержимое файла будет прочитано, только если вы укажете имя файла. dtype определяет тип данных в возвращаемом массиве. Count задаёт число элементов массива. Sep – для разделения элементов текста или массива. Offset определяет позицию в файле, с которой начинается считывание. Последний аргумент нужен, чтобы создать массив, не являющийся массивом NumPy.

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

Результат

После выполнения скрипта мы увидим следующий результат.


Заключение

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

Кодировка Base64 позволяет нам преобразовывать байты, содержащие двоичные или текстовые данные, в символы ASCII. В этом уроке мы будем кодировать и декодировать строки Base64 в Python.

Вступление

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

Кодировка Base64 позволяет нам преобразовывать байты, содержащие двоичные или текстовые данные, в символы ASCII . Кодируя наши данные, мы повышаем вероятность их правильной обработки различными системами.

В этом уроке мы узнаем, как работает кодирование и декодирование Base64 и как его можно использовать. Затем мы будем использовать Python для кодирования и декодирования Base64 как текстовых, так и двоичных данных.

  • Что Такое Кодировка Base64?
  • Как Работает Кодировка Base64?
  • Зачем Использовать Кодировку Base64?
  • Кодирование строк с помощью Python
  • Декодирование строк с помощью Python
  • Кодирование двоичных данных с помощью Python
  • Декодирование двоичных данных с помощью Python
  • Вывод

Что такое кодировка Base64?

Набор символов Base64 содержит:

  • 26 заглавных букв
  • 26 строчных букв
  • 10 чисел
  • + и / для новых строк (некоторые реализации могут использовать разные символы)

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

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

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

Как Работает Кодировка Base64?

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

01010000 01111001 01110100 01101000 01101111 01101110

010100 000111 100101 110100 011010 000110 111101 101110

Примечание: Иногда мы не можем сгруппировать данные в последовательности по 6 бит. Если это произойдет, мы должны дополнить последовательность .

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

20 7 37 52 26 6 61 46

Наконец, мы преобразуем эти десятичные дроби в соответствующий символ Base64 с помощью таблицы преобразования Base64:

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

Зачем использовать кодировку Base64?

В компьютерах все данные различных типов передаются как 1s и 0s. Однако некоторые каналы связи и приложения не в состоянии понять все биты, которые он получает. Это происходит потому, что значение последовательности 1 и 0 зависит от типа данных, которые она представляет. Например, 10110001 должен быть обработан по-другому, если он представляет собой букву или изображение.

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

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

Кодирование строк с помощью Python

Python 3 предоставляет модуль base64 , который позволяет нам легко кодировать и декодировать информацию. Сначала мы преобразуем строку в байтоподобный объект. После преобразования мы можем использовать модуль base64 для его кодирования.

В новом файле encoding_text.py , введите следующее:

В приведенном выше коде мы сначала импортировали модуль base64 . Переменная message хранит нашу входную строку для кодирования. Мы преобразуем его в байтоподобный объект, используя метод строки encode , и сохраняем его в message_bytes . Затем мы кодируем Base64 message_bytes и сохраняем результат в base64_bytes с помощью метода base64.b64encode . Наконец, мы получаем строковое представление преобразования Base64, декодируя base64_bytes как ASCII.

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

Запуск этого файла приведет к следующему результату:

Теперь давайте посмотрим, как мы можем декодировать строку Base64 в ее необработанное представление.

Декодирование строк с помощью Python

Декодирование строки Base64, по сути, является обратным процессом кодирования. Мы декодируем строку Base64 в байты некодированных данных. Затем мы преобразуем байтоподобный объект в строку.

В новом файле под названием decoding_text.py , напишите следующий код:

Запустите этот файл, чтобы увидеть следующие выходные данные:

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

Кодирование двоичных данных с помощью Python

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

Давайте посмотрим, как мы можем закодировать этот образ:

Создайте новый файл encoding_binary.py и добавить следующее:

Затем мы используем метод read () , чтобы получить все данные в файле в переменную binary_file_data . Аналогично тому, как мы обрабатывали строки, мы Base64 кодировали байты с помощью base64.b64encode , а затем использовали decode('utf-8') on base64_encoded_data , чтобы получить кодированные Base64 данные с помощью удобочитаемых символов.

Выполнение кода приведет к получению аналогичного результата:

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

Теперь, когда мы знаем, как Bas64 кодирует двоичные данные в Python, давайте перейдем к декодированию двоичных данных Base64.

Декодирование двоичных данных с помощью Python

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

Давайте посмотрим, как Base64 декодирует двоичные данные на практике, создавая новый файл с именем decoding_binary.py . Введите следующий код в файл Python:

В приведенном выше коде мы сначала преобразуем наши строковые данные Base64 в байтоподобный объект, который можно декодировать. Когда вы декодируете двоичный файл base64, вы должны знать тип данных, которые декодируются . Например, эти данные действительны только в виде PNG-файла, а не MP3-файла, поскольку они кодируют изображение.

Как только файл назначения открыт, мы Base64 декодируем данные с помощью base64.decodebytes , отличного метода от base64.b64decode , который использовался со строками. Этот метод следует использовать для декодирования двоичных данных. Наконец, мы записываем декодированные данные в файл.

В том же каталоге, который вы выполнили decoding_binary.py , теперь вы должны увидеть новый файл decoded_image.jpg , содержащий исходное изображение, которое было закодировано ранее.

Вывод

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

С помощью Python мы можем использовать модуль base64 для кодирования и декодирования текстовых и двоичных данных Base64.

Какие приложения вы бы использовали для кодирования и декодирования данных Base64?


В этой статье мы рассмотрим, как преобразовать байты в строку в Python. К концу этой статьи у вас будет четкое представление о том, что это за типы и как эффективно обрабатывать данные с их помощью.

В зависимости от версии Python, которую вы используете, эта задача будет отличаться. Хотя Python 2 подошел к концу, многие проекты все еще используют его, поэтому мы включим оба подхода - Python 2 и Python 3.

Преобразование байтов в строку в Python 3

Начиная с Python 3, пришлось отказаться от старого способа работы с ASCII, и Python стал полностью Unicode.

Это означает, что мы потеряли явный тип Unicode: u"string" - каждая строка - это u"string" !

Чтобы отличить эти строки от старых добрых строк байтов, мы познакомились с новым спецификатором для них - b"string" .

Это было добавлено в Python 2.6, но не служило реальной цели, кроме подготовки к Python 3, поскольку все строки были байтовыми строками в 2.6.

Строки байтов в Python 3 официально называются bytes , неизменной последовательностью целых чисел в диапазоне 0 <= x <256. Другой bytes - подобный объект, добавленный в 2.6, bytearray - похож на bytes , но изменяемый.

Преобразование байтов в строку с помощью&nbsp;decode()

Давайте посмотрим, как мы можем преобразовать байты в String, используя встроенный метод decode() для класса bytes :

Передав формат кодирования, мы преобразовали объект bytes в строку и распечатали ее.

Преобразование байтов в строку с&nbsp;кодеками

Как вариант, для этой цели мы можем использовать встроенный модуль codecs :

Вам действительно не нужно передавать параметр кодировки, однако рекомендуется передавать его:

Преобразование байтов в строку с помощью&nbsp;str()

Наконец, вы можете использовать str() функцию, которая принимает различные значения и преобразует их в строки:

Не забудьте указать аргумент кодировки str() , иначе вы можете получить неожиданные результаты:

Это снова подводит нас к кодировкам. Если вы укажете неправильную кодировку, в лучшем случае произойдет сбой вашей программы, потому что она не может декодировать данные. Например, если бы мы попытались использовать функцию str() с UTF-16 , нас бы встретили:

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

Преобразование байтов в строку в Python 2

В Python 2 набор байтов и строка - это практически одно и то же: строки - это объекты, состоящие из однобайтовых символов, что означает, что каждый символ может хранить 256 значений. Вот почему их иногда называют строками байтов.

Это замечательно при работе с байтовыми данными - мы просто загружаем их в переменную и готовы к печати:

Однако использование символов Unicode в строках байтов немного меняет это поведение:

Преобразование байтов в Unicode (Python 2)

Здесь нам придется использовать тип Python 2 Unicode , который предполагается и автоматически используется в Python 3. В нем строки хранятся как последовательность кодовых точек, а не байтов.

Представляет собой байты \xf0\x9f\x8d\x95 , последовательность шестнадцатеричных чисел и Python не знает, как представить их в виде ASCII:

Как вы можете видеть выше, строка Unicode содержит \U0001f355 - экранированный символ Unicode, который наш терминал распечатывает как кусок пиццы! Установить это было так же просто, как использовать спецификатор u перед значением байтовой строки.

Итак, как мне переключаться между ними?

Вы можете получить строку Unicode, расшифровав свою байтовую строку. Это можно сделать, создав объект Unicode, предоставив байтовую строку и строку, содержащую имя кодировки в качестве аргументов, или вызвав .decode(encoding) у байтовой строки.

Преобразование байтов в строку с помощью&nbsp;decode()&nbsp;(Python 2)

Вы также можете использовать codecs.encode(s, encoding) из модуля codecs .

Преобразование байтов в строку с помощью&nbsp;кодеков&nbsp;(Python 2)

Или, используя модуль codecs :

Помните о своей кодировке

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

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