Как записать отдельные биты в текстовый файл на Python? - PullRequest
7 голосов
/ 05 марта 2011

Предположим, у меня есть число, например 824, и я записываю его в текстовый файл, используя python. В текстовом файле это займет 3 байта. Однако, если я представляю его, используя биты, он имеет следующее представление 0000001100111000, которое составляет 2 байта (16 битов). Мне было интересно, как я могу записать биты в файл в Python, а не байты. Если я смогу это сделать, размер файла будет 2 байта, а не 3. Пожалуйста, предоставьте код. Я использую Python 2.6. Кроме того, я не хочу использовать какие-либо внешние модули, которые не входят в базовую установку Я попробовал ниже и дал мне 12 байтов!

a =824;
c=bin(a)
handle = open('try1.txt','wb')
handle.write(c)
handle.close()

Ответы [ 3 ]

10 голосов
/ 05 марта 2011

Модуль struct - это то, что вам нужно. Из вашего примера 824 = 0000001100111000 двоичный или 0338 шестнадцатеричный. Это два байта 03H и 38H. struct.pack преобразует 824 в строку из этих двух байтов, но вы также должны выбрать порядок с прямым порядком байтов (сначала запишите 38H) или порядок с прямым порядком байтов (напишите сначала 03H).

Пример

>>> import struct
>>> struct.pack('>H',824) # big-endian
'\x038'
>>> struct.pack('<H',824) # little-endian
'8\x03'
>>> struct.pack('H',824)  # Use system default
'8\x03'

struct возвращает двухбайтовую строку. обозначение \ x ## означает (байт с шестнадцатеричным значением ##). «8» - это ASCII «8» (значение 38H). Байтные строки Python используют ASCII для печатных символов и нотацию \ x ## для непечатаемых символов.

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

import struct

a = 824
bin_data = struct.pack('<H',824)
print 'bin_data length:',len(bin_data)

with open('data.bin','wb') as f:
    f.write(bin_data)

with open('data.bin','rb') as f:
   bin_data = f.read()
   print 'Value from file:',struct.unpack('<H',bin_data)[0]

print 'bin_data representation:',repr(bin_data)
for i,c in enumerate(bin_data):
    print 'Byte {0} as binary: {1:08b}'.format(i,ord(c))

выход

bin_data length: 2
Value from file: 824
bin_data representation: '8\x03'
Byte 0 as binary: 00111000
Byte 1 as binary: 00000011
5 голосов
/ 05 марта 2011

Взгляните на struct :

>>> struct.pack("h", 824)
'8\x03'
2 голосов
/ 05 марта 2011

Я думаю, что вы хотите open файл в двоичном режиме:

open("file.bla", "wb")

Однако в файл будет записано целое число, которое, вероятно, будет иметь размер 4 байта. Я не знаю, имеет ли Python 2-байтовый целочисленный тип. Но вы можете обойти это, кодируя 2 16-битное число в одно 32-битное число:

a = 824
b = 1234
c = (a << 16) + b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...