Как сохранить стороку данных нулей и единиц в бинарной кодировке 1 символ = 1 bit?

Рейтинг: 1Ответов: 1Опубликовано: 24.02.2023

Подскажите, есть ли какая-нибудь простая возможность битовую строку длиной примерно 2^17 < n < 2^23, сохранить в файл с кодировкой на один символ 1 bit?

Допустим, выполнив код:

with open('data/bin_file.bin', 'wb') as bin_file:
   str = ''
   for i in range(1024):
       str += '1'
   bin_file.write(str.encode())

то на выходе получим файл bin_file.bin, но при этом, в нем всё также будет выделено на один символ 1 байт. Как я понял это особенность самого менеджера файлов с ключем b, что он записывает всё как байтстроку (или питона в целом?)? Как это обойти?

введите сюда описание изображения

И, в общем, в связи с этим и вопрос, как сохранить, и затем считать, бинарные данные в файл так, чтобы кодировалось 1 символ = 1 bit?

Нужно это всё для экономии места, т.к. таких файлов ещё около n.

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

Или я что-то делаю не так?

Ответы

▲ 1Принят

Вам необходимо использовать метод bitarray.tofile() с модуля bitarray для того, чтобы запись битовых строк в файле производилась в формате: 1 символ = 1 bit.

Более детально можете ознакомиться на pypi.org

Код решения:

import bitarray

# Создаем битовую строку
bit_string = bitarray.bitarray()
bit_string.frombytes(b'Hello StackOverFlow')

# Открываем файл для записи в бинарном формате
with open('data/bin_file.bin', 'wb') as bin_file:
   bit_string.tofile(bin_file)

# Открываем файл для чтения в бинарном формате
with open('data/bin_file.bin', 'rb') as bin_file:
    bit_string = bitarray.bitarray()
    bit_string.fromfile(bin_file)

# Декодируем битовую строку в строку utf-8
decoded_string = bit_string.tobytes().decode('utf-8')

# Выводим полученную битовую строку
print(bit_string)

# Выводим результат декодирования
print(decoded_string)

Результат даного кода будет таковым:

bitarray('01001000011001010110110001101100011011110010000001010011011101000110000101100011011010110100111101110110011001010111001001000110011011000110111101110111')
Hello StackOverFlow

А количество bit будет соответствовать количеству символов - 19: введите сюда описание изображения