我想把计算出来的crc附加到现有的二进制文件中。在
例如,crc是0x55667788。在
我想在文件末尾追加0x55、0x66、0x77和0x88。在
例如,如果我用HexEdit打开文件,文件的最后四个字节 将显示0x55667788。在
以下是我目前为止的代码:
fileopen = askopenfilename()
filename = open(fileopen, 'rb+')
filedata = filename.read()
filecrc32 = hex(binascii.crc32(filedata))
filename.seek(0,2)
filename.write(filecrc32)
filename.close()
我得到以下错误:
^{pr2}$有什么建议吗?在
^{} 函数返回一个字符串。在本例中,有一个由10个十六进制字符组成的字符串,表示4个字节的数字,如下所示:
在python2.x中,您可以将这些不正确的数据写入二进制文件(它将显示为10个字节
30 78 35 35 36 36 37 37 38 38
,而不是您想要的四个字节55 66 77 88
)。python3.x更聪明,只允许您将bytes
(或bytearray
或类似文件)写入二进制文件,而不是str
。在这里需要的不是十六进制字符串,而是实际的字节。在
您描述所需字节的方式称为big-endian order。在大多数计算机上,“本机”顺序是相反的,little endian,这将给您}。在
0x88776655
而不是{在python3.2+中,最简单的方法是^{} 方法:
^{pr2}$(实际上,
signed=False
不是必需的,因为它是默认值,但它是一个很好的方法,可以让您明确地知道您正在处理一个无符号的32位整数。)如果您坚持使用早期版本,可以使用^{} 模块:
>
表示大尾数,I
表示无符号4字节整数。所以,这返回相同的结果。在这两种情况下,您得到的是b'\x55\x66\x77\x88'
(或者,正如Pythonrepr
它,b'\Ufw\x88'
)。在这个错误有点神秘,因为没有新手会知道“缓冲区接口”是什么(尤其是因为3.x文档将其称为Buffer Protocol,而且它只作为CPython的C扩展API的一部分进行了记录……),但实际上这意味着您需要一个bytes-like object。通常,这个错误意味着您忘记将字符串编码为UTF-8或其他编码。但是,当您试图编写实际的二进制数据而不是编码文本时,这是相同的错误。在
您需要序列化数据。序列化是获取 整数中的相关字节。在你的情况下,你的CRC是 4字节编号。可将单个4字节检索到如下列表中:
然后,可以通过转换为字节数组将CRC写入文件,如下所示:
^{pr2}$相关问题 更多 >
编程相关推荐