用于 Python 的无符号 CRC 32 匹配 Java 的 CRC 32?

Vic*_*Lin 3 python java networking crc32

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

在 Java 端,CRC 32 是无符号的:

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

但是在 Python 的末尾,CRC 32 已签名:

//where some_segment is a bytearray() of data
crc = zlib.crc32(some_segment)
Run Code Online (Sandbox Code Playgroud)

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

ACh*_*ion 5

您可以按位计算结果0xffffffff以获得无符号值:

crc = zlib.crc32(some_segment) & 0xffffffff
Run Code Online (Sandbox Code Playgroud)

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

  • 在二进制补码中,最后一位表示负数(不是额外的位)。所以这是有效的,因为Python int不是32位,假设int是64位(比这复杂得多),那么按位计算,任何带有0xffffffff(32位)的东西都将是0x00000000xxxxxxxx,所以将是正数。-1 在 64 位中是 0xffffffffffffffff,所以 -1 & 0xffffffff = 0x00000000ffffffff。希望这是有道理的。 (2认同)