Это для сжатия файлов. Я хотел бы сохранить двоичную строку, например «00011110», как реальную последовательность 1 и 0, чтобы при использовании команды Powershell «format-hex» для просмотра сохраненного файла я увидел
1E
который является шестнадцатеричным представлением двоичного числа 00011110. Вместо
00 00 00 01 01 01 01 00
это то, что bytearray() дал бы мне. Кажется, должен быть простой способ сделать это.
Отвечает ли это на ваш вопрос? Как вернуть число в виде двоичной строки с заданным количеством бит в python
не совсем; проблема в том, как сохранить его в файл. т.е. «двоичная строка», сохраненная из python, фактически не сохраняется в буквальном двоичном формате, она по-прежнему использует ascii
Ваша проблема состоит из трех частей: сначала вы должны преобразовать строку в целое число, а затем это целое число должно быть преобразовано в строку байтов, которую можно записать в файл.
file = open(path_to_file, 'wb') # open file in binary write mode
integer = int("00011110", 2)
byte = integer.to_bytes(1,'big') # endianness is irrelevant with a single byte
file.write(byte) # writes the single byte to the file
Это должно позволить записывать октеты в двоичном режиме и записывать их напрямую; теперь файл должен содержать только фактический октет 00011110
, или целое число 30, или разделитель записи управляющего символа.
Достаточно ли будет использовать b'00011110'
?
строка 3 вызывает AttributeError: объект 'str' не имеет атрибута 'to_bytes'
@mapf Нет, это совершенно другая строка байтов, которая на самом деле имеет длину 8 байтов. Эта байтовая строка содержит кодировку ASCII из 8 различных символов, что не является тем, что o.p. хочет.
@aloea, это моя ошибка — я только что исправил ее. я забыл разобрать строку
@Zorf Понятно, спасибо! Я никогда не работал с ними, я думал, что они используются для этого.
это здорово, как вы думаете, это будет работать с более длинными битовыми строками, или мне придется перебирать их, сохраняя 8 за раз
@aloea, можно редактировать целое число в части to_bytes
по своему усмотрению для работы с целыми числами, которые потребляют более одного байта, чтобы оно возвращало строки байтов из более чем одного байта, но имейте в виду, что в этот момент порядок байтов становится фактором, хотя вы, вероятно, хотите с прямым порядком байтов.
int("00011110", 2)
будет анализировать строку как двоичное число.