Python 的未签名 CRC 32 与 Java 的 CRC 32 相匹配?

Unsigned CRC 32 for Python to match Java's CRC 32?

Python 客户端通过不可靠的通道与 Java 服务器通信,他们必须通过 CRC32 通信包损坏。

在 Java 的结尾,CRC 32 是无符号的:

//where data is a byte[]
crc.update(data, 8, data.length-8);
long chksum = crc.getValue();

但是在 Python 的最后,CRC 32 被签名:

//where some_segment is a bytearray() of data
crc = zlib.crc32(some_segment)

有没有办法计算 Python 的 crc32 中的校验和以匹配 Java 的校验和?换句话说,使 python 的 crc32 无符号?

在 crc 上做 & 0xffffffff

您可以使用 0xffffffff 对结果进行位运算以获得无符号值:

crc = zlib.crc32(some_segment) & 0xffffffff

在 Python 3 中这是默认设置,因此您只需要在 python 2.X 上使用它,但对两个版本都适用。