Прежде всего, вы не получите размер файла, который не является кратным 8 бит на любой популярной платформе.
Во-вторых, вам действительно нужно очистить то, что на самом деле означает «двоичный». Вы путаете два разных понятия: представляете число в двоичной системе чисел и записываете данные в форме, не читаемой человеком.
На самом деле вы вводите в заблуждение два более фундаментальных понятия: данные и представление данных. "12ab"
представляет собой представление четырех байтов в памяти, равно "\x31\x32\x61\x62"
.
Ваша проблема в том, что x
содержит 28 байт данных, которые могут либо быть представлены в виде "0110001011001011000011100010"
или "\x30\x31\x31\x30\x30...\x30\x30\x31\x30"
Может быть, это поможет вам:.
>>> hexstr = "12ab"
>>> len(hexstr)
4
>>> ['"%s": %x' % (c, ord(c)) for c in hexstr]
['"1": 31', '"2": 32', '"a": 61', '"b": 62']
>>> i = 42
>>> hex(i)
'0x2a'
>>> x = '{0:07b}'.format(i)
>>> x
'0101010'
>>> [hex(ord(c)) for c in x]
['0x30', '0x31', '0x30', '0x31', '0x30', '0x31', '0x30']
>>> hex(ord('0')), hex(ord('1'))
('0x30', '0x31')
>>> import binascii
>>> [hex(ord(c)) for c in binascii.unhexlify(hexstr)]
['0x12', '0xab']
Это говорит, THHE binascii модуль имеет метод, который вы можете использовать:
import binascii
data = binascii.unhexlify(hexstr)
with open('outputfile.bin', 'wb') as f:
f.write(data)
Это будет кодировать ваши данные в 8 бит вместо из 7 бит, но, как правило, в любом случае не стоит пытаться использовать 7bit по причинам сжатия.
Да, python 'filobject.write' ожидает строку, поэтому она, вероятно, также записывает ее как строку. – aIKid
Я думаю, что, возможно, модуль binascii - это то, что вы ищете ... – gtgaxiola
Вы видели [это] (http://stackoverflow.com/q/2452861/149530) вопрос? Обратите внимание, что сохранение 7 бит для каждого символа ASCII будет сохранять только 1 октет каждые 8 символов - возможно, меньше в зависимости от вашей файловой системы. –