2016-09-17 67 views
0

我一直在研究一个程序,并一直试图转换一个大的二进制文件(作为字符串)并将其打包到一个文件中。我已经尝试了好几天来让这样的事情成为可能。这是我编写的打包大型二进制字符串的代码。在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 

我的整数超出范围,所以我想知道是否有要去有关与此不同的方式。

由于

+0

我猜你的意思'M'代替的'x'?在这种情况下,'long'对于只支持整数的东西来说太多 – Li357

回答

0

struct.pack您已经使用的“i”表示一个整数,这是有限的。如您的代码所述,您的输出很长;因此,您可能想用'd'替代'i',将数据打包为双倍。它应该工作。

有关更多信息,请参阅Python struct

+0

虽然double(几乎)在数量有多大时几乎是无限的,但它们可以只代表高达56bit的整数。 – janbrohl

+0

+ jahbrohl你有其他选择吗? – Dan

+1

是的,看我的答案 – janbrohl

1

字节对于大端序(如“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 
相关问题