首先,在任何流行平台上,您都不会得到不是 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 位。