【问题标题】:Compute the checksum for a binary file in Python在 Python 中计算二进制文件的校验和
【发布时间】:2018-08-03 06:23:55
【问题描述】:

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

00 00 00 DD 11 22 33 44

二进制内容如下(小端格式):

11011101 00000000 00000000 00000000 01000100 00110011 00100010 00010001 

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

那么手动步骤应该如下所示:

   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

如果我错误地计算了校验和,请纠正我。 我为计算系统中的校验和而编写的代码不能正常工作。

add = 0
with open("temp.bin", "rb") as f:
    ## Read first 4 bytes of data
    byte = f.read(4)
    while byte != "":
        add += int.from_bytes(byte, byteorder="little")
    print(b"%02X" % (~add & 0xFFFFFFFF))

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

【问题讨论】:

  • 校验和不应该是 XOR 结果的导数吗?顺便说一句:这是 Python 中的二进制补码函数:en.wikipedia.org/wiki/Two%27s_complement
  • 使用这个特定的校验和吗?使用标准库(adler32 或 crc32)中的一个会更快,因为它们以 C 速度运行。

标签: python checksum


【解决方案1】:

您没有在while 循环中更新byte,因此循环永远不会结束。

你应该从f继续阅读直到byteNone

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))

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 2013-05-28
    • 2012-08-27
    • 2021-04-05
    • 2022-12-03
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    相关资源
    最近更新 更多