在Python中将大二进制代码转换为文件
问题描述:
我一直在研究一个程序,并一直试图转换一个大的二进制文件(作为字符串)并将其打包到一个文件中。我已经尝试了好几天来让这样的事情成为可能。这是我编写的打包大型二进制字符串的代码。在Python中将大二进制代码转换为文件
binaryRecieved="11001010101....(Shortened)"
f=open(fileName,'wb')
m=long(binaryRecieved,2)
struct.pack('i',m)
f.write(struct.pack('i',m))
f.close()
quit()
我留下错误
struct.pack('i',x)
struct.error: integer out of range for 'i' format code
我的整数超出范围,所以我想知道是否有要去有关与此不同的方式。
由于
答
在struct.pack
您已经使用的“i”表示一个整数,这是有限的。如您的代码所述,您的输出很长;因此,您可能想用'd'替代'i',将数据打包为双倍。它应该工作。
有关更多信息,请参阅Python struct。
答
字节对于大端序(如“10”被在正常十进制使用写为“10”)编码米使用:
def as_big_endian_bytes(i):
out=bytearray()
while i:
out.append(i&0xff)
i=i>>8
out.reverse()
return out
对于小端编码m
顺序(如“十”正在正常十进制使用写为“01”)使用方法:
def as_little_endian_bytes(i):
out=bytearray()
while i:
out.append(i&0xff)
i=i>>8
return out
两个功能在起作用 - 就像你在你的问题做 - 所以返回的字节组可能会比预期的短(因为对于领导零的数字无关紧要)。
对于二进制数字串的一个精确的表示(这是唯一可能的,如果它的长度是8整除),你必须做的:
def as_bytes(s):
assert len(s)%8==0
out=bytearray()
for i in range(0,len(s)-8,8):
out.append(int(s[i:i+8],2))
return out
我猜你的意思'M'代替的'x'?在这种情况下,'long'对于只支持整数的东西来说太多 – Li357