用Python向二进制文件追加数据字节

2024-09-28 21:55:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把计算出来的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}$

有什么建议吗?在


Tags: 文件代码read字节二进制openfilenamecrc
2条回答

^{}函数返回一个字符串。在本例中,有一个由10个十六进制字符组成的字符串,表示4个字节的数字,如下所示:

'0x55667788'

在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位整数。)

如果您坚持使用早期版本,可以使用^{}模块:

filecrc = struct.pack('>I', binascii.crc32(filedata))

>表示大尾数,I表示无符号4字节整数。所以,这返回相同的结果。在这两种情况下,您得到的是b'\x55\x66\x77\x88'(或者,正如Python repr它,b'\Ufw\x88')。在


这个错误有点神秘,因为没有新手会知道“缓冲区接口”是什么(尤其是因为3.x文档将其称为Buffer Protocol,而且它只作为CPython的C扩展API的一部分进行了记录……),但实际上这意味着您需要一个bytes-like object。通常,这个错误意味着您忘记将字符串编码为UTF-8或其他编码。但是,当您试图编写实际的二进制数据而不是编码文本时,这是相同的错误。在

您需要序列化数据。序列化是获取 整数中的相关字节。在你的情况下,你的CRC是 4字节编号。可将单个4字节检索到如下列表中:

serialized_crc = [(filecrc32 >> 24) & 0xFF,(filecrc32 >> 16) & 0xFF,
                 (filecrc32 >> 8) & 0xFF,filecrc32 & 0xFF]

然后,可以通过转换为字节数组将CRC写入文件,如下所示:

^{pr2}$

相关问题 更多 >