Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python将大型二进制代码转换成文件_Python_File_Binary - Fatal编程技术网

用Python将大型二进制代码转换成文件

用Python将大型二进制代码转换成文件,python,file,binary,Python,File,Binary,我一直在编写一个程序,我一直在尝试转换一个大的二进制文件(作为字符串)并将其打包成一个文件。我已经试了好几天使这件事成为可能。下面是我为打包这个大的二进制字符串而编写的代码 binaryRecieved="11001010101....(Shortened)" f=open(fileName,'wb') m=long(binaryRecieved,2) struct.pack('i',m) f.write(struct.pack('i',m)) f.close() quit() 这个错误留给我

我一直在编写一个程序,我一直在尝试转换一个大的二进制文件(作为字符串)并将其打包成一个文件。我已经试了好几天使这件事成为可能。下面是我为打包这个大的二进制字符串而编写的代码

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”,将数据打包为double。它应该会起作用。


有关更多信息,请参见。

结构包中,您使用了表示整数的“i”,但该整数是有限的。正如您的代码所述,您的输出很长;因此,您可能希望使用“d”而不是“i”,将数据打包为double。它应该会起作用。



有关更多信息,请参阅。

将位字符串转换为字节字符串:例如,请参阅此问题。然后用
struct.pack('c',bytestring)

将位字符串转换为字节字符串:例如,请参见此问题。然后使用
struct.pack('c',bytestring)

对字节进行打包,以便以大端顺序对m进行编码(如“十”在正常十进制使用中被写为“10”)。使用:

对于以小尾数顺序编码
m
(如“十”在正常十进制中被写为“01”)使用:

这两个函数都处理数字-就像您在问题中所做的那样-因此返回的bytearray可能比预期的短(因为对于数字,前导零并不重要)

对于二进制数字字符串的精确表示(仅当其长度可除以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(如“十”在正常十进制使用中被写为“10”),请使用:

对于以小尾数顺序编码
m
(如“十”在正常十进制中被写为“01”)使用:

这两个函数都处理数字-就像您在问题中所做的那样-因此返回的bytearray可能比预期的短(因为对于数字,前导零并不重要)

对于二进制数字字符串的精确表示(仅当其长度可除以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
对于只支持整数的东西来说太多了我猜你的意思是
m
而不是
x
?在这种情况下,
long
对于只支持整数的东西来说太多了。虽然double(几乎)不受数字大小的限制,但它们只能表示56位以下的整数。+jahbrohl你有其他选择吗?是的,请看我的回答。而double(几乎)不受数字大小的限制,它们只能表示56位以下的整数。+jahbrohl你有其他选择吗?是的,请看我的答案
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