2013-11-01 5 views
0

У меня есть txt-файл с потоком данных HEX, я хотел бы преобразовать его в двоичный файл fomart, чтобы сэкономить место на диске.файл ascii txt в двоичный файл bin

это мой простой скрипт, просто чтобы проверить и декодирования двоичного хранения

hexstr = "12ab" 

of = open('outputfile.bin','wb') 

for i in hexstr: 
    #this is how I convert an ASCII char to 7 bit representation 
    x = '{0:07b}'.format(ord(i)) 
    of.write(x) 

of.close() 

Я EXECT что outputfile.bin имеет размер 28 бит, а результаты в 28 байт. Я думаю, проблема в том, что x - это строка, а не последовательность бит.

Как мне это сделать?

Заранее спасибо

+0

Да, python 'filobject.write' ожидает строку, поэтому она, вероятно, также записывает ее как строку. – aIKid

+0

Я думаю, что, возможно, модуль binascii - это то, что вы ищете ... – gtgaxiola

+0

Вы видели [это] (http://stackoverflow.com/q/2452861/149530) вопрос? Обратите внимание, что сохранение 7 бит для каждого символа ASCII будет сохранять только 1 октет каждые 8 ​​символов - возможно, меньше в зависимости от вашей файловой системы. –

ответ

0

Прежде всего, вы не получите размер файла, который не является кратным 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 по причинам сжатия.

+0

спасибо за ваше решение, он делает больше, чем я ожидал! да ... Я должен рассмотреть «двоичные» значения – user2944566

0

Является ли это то, что вы хотите? «12ab» следует написать как \x01\x02\x0a\x0b, правильно?

import struct 

hexstr = "12ab" 

of = open('outputfile.bin','w') 

for i in hexstr: 
    of.write(struct.pack('B', int(i, 16))) 

of.close() 
+1

Просто опубликуйте, что .. никогда. Nice answer :) – aIKid

+0

Вы также можете использовать 'chr (int (i, 16))' – JadedTuna

+0

Фактически в 7-битной кодировке '' 12ab'' следует записывать как '\ xC5 \ x96 \ x1C \ x40'. –

Смежные вопросы