Zlib Ruby 和 Python 库中的 CRC32 校验和不同

CRC32 checksums are different in Zlib Ruby and Python libraries

我正在尝试为同一字符串在 Ruby 和 Python 中生成 CRC32 校验和,但得到不同的结果。

Python

from zlib import crc32
x = "SheetJS"
crc32(x)
#=> -1647298270

NodeJS

var CRC32 = require('crc-32');
var x = "SheetJS";
CRC32.str(x); 
#=> -1647298270

Ruby

require 'zlib'
x = "SheetJS"
Zlib::crc32(x)
#=> 2647669026

这些是相同的值,区别在于解释。 Python 和 NodeJS 将 crc32 解释为有符号数,Ruby - 为无符号数。看看:

In [1]: import struct

In [2]: struct.unpack('i', struct.pack('I', 2647669026))
Out[2]: (-1647298270,)

我们正在将 2647669026 转换为无符号整数字节,然后将其作为有符号整数读取。