用Python计算二进制文件的校验和

用Python计算二进制文件的校验和,python,checksum,Python,Checksum,我有一个二进制文件(2字节),其十六进制格式的内容如下: 00 00 00 DD 11 22 33 44 11011101 00000000 00000000 00000000 + 01000100 00110011 00100010 00010001 -------------------------------------- = 00100001 00110011 00100010 00010001 11011110 11001100 11011101 1110

我有一个二进制文件(2字节),其十六进制格式的内容如下:

00 00 00 DD 11 22 33 44
   11011101 00000000 00000000 00000000
+ 
   01000100 00110011 00100010 00010001
  --------------------------------------
=  00100001 00110011 00100010 00010001

   11011110 11001100 11011101 11101110  (1's complement)
+
   00000000 00000000 00000000 00000001  (add 1) <br/>
-----------------------------------------
=  11011110 11001100 11011101 11101111  (2's complement) = CheckSum
二进制格式的内容如下所示(小尾端格式):

我想手动计算文件的校验和,并将其附加到文件末尾。对于计算,我考虑一次4字节块

然后,手动步骤应如下所示:

00 00 00 DD 11 22 33 44
   11011101 00000000 00000000 00000000
+ 
   01000100 00110011 00100010 00010001
  --------------------------------------
=  00100001 00110011 00100010 00010001

   11011110 11001100 11011101 11101110  (1's complement)
+
   00000000 00000000 00000000 00000001  (add 1) <br/>
-----------------------------------------
=  11011110 11001100 11011101 11101111  (2's complement) = CheckSum

请帮助我解决上述问题和代码。

循环期间,您没有更新
字节中的
,因此循环永远不会结束

您应该一直从
f
读取,直到
byte
None

add = 0
with open("/temp/test.py", "rb") as f:
    ## Read first 4 bytes of data
    while True:
        byte = f.read(4)
        if not byte:
            break
        add += int.from_bytes(byte, byteorder='little')
    print(b'%02X' % (~add & 0xFFFFFFFF))

校验和不应该是XOR结果的导数吗?顺便说一句:这是Python中的twos补码函数:您必须使用这个特定的校验和吗?使用标准库(adler32或crc32)中的一个会更快,因为它们以C速度运行。