我有一个带有HEX数据流的txt文件,我想将其转换为二进制文件,以节省磁盘空间。
这是我用来测试解码和二进制存储的简单脚本
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()
我认为outputfile.bin的大小为28位,而结果是28字节。 我想问题是x是一个字符串而不是一个比特序列。
我该怎么办?
提前致谢
答案 0 :(得分:0)
\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 :(得分: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']
那就是说,binascii模块有一个你可以使用的方法:
import binascii
data = binascii.unhexlify(hexstr)
with open('outputfile.bin', 'wb') as f:
f.write(data)
这会将您的数据编码为8位而不是7位,但通常无论如何都不值得使用7位压缩原因。