Python 计算有符号的 CRC32 整数到校验和



我想计算以下字符串的校验和。

3556.5:200:3557.0:2:3556.4:84:3557.4:4:3555.7:6:3557.7:14:3555.1:46:3558.6:21:3552.9:14:3558.7:10:3552.8:194:3558.8:106:3552.7:10:3558.9:10:3552.6:25:3560.2:178:3552.5:4:3560.5:111:3551.7:1:3561.7:1:3551.6:65:3562.5:18:3551.0:103:3562.6:111:3550.7:3:3562.7:3:3550.6:4:3562.8:185:3550.5:1:3563.7:1:3550.3:84:3564.2:1:3550.2:156:3564.8:153:3550.0:82:3565.0:400:3549.7:1:3565.9:60:3548.4:104:3566.1:20:3547.2:177:3566.5:40:3545.9:1:3568.0:20:3545.1:11:3569.4:12:3545.0:71:3570.0:82:3544.9:1:3570.6:4

我这样做如下

string2 = string.encode('ascii')
checksum = zlib.crc32((string2))

这给了我一个3467096777的整数。但是,服务器提供商说它应该是 -949017128。此外,我尝试了字符串的许多变体,但总是以正数结束,这不知何故导致我计算有符号 crc32 整数的方式可能是错误的。

我通过以下方式转换了 -949017128

checksum_server = -949017128 & 0xffffffff

它产生3345950168,这仍然与我的不同。

有没有办法从有符号的 crc32 整数 -949017128 中计算字符串?

我认为这是BTC在okex的价格。多么美好的时光!

zlib 的 crc32 返回一个与有符号数字不同的无符号数字作为 API 文档;如果服务器check_sum为正,它们应该相等;如果服务器check_sum为负数,则需要检查如下(应该有更好的解决方案):

check_sum = zlib.crc32(checksum_str.encode("utf-8"))
if server_check_sum < 0 and 2 ** 32 - check_sum + server_check_sum == 0 or server_check_sum == check_sum:
    print(f"{instrument_id}: checksum successful")

必须确保字符串的格式已更正,如果执行类型转换,则不添加"0"。