我在这里找到了 adler32 的代码http://developer.classpath.org/doc/java/util/zip/Adler32-source.html
但是我的更新代码如下所示
private int a = 1, b = 0;
public void update(byte[] buf, int offset, int len)
{
for (int i = offset; i < len; i++) {
a = (a + buf[i]) % MOD_ADLER;
b = (b + a) % MOD_ADLER;
}
}
作为链接上的相反代码
public void update(byte[] buf, int offset, int len)
{
for (int i = offset; i < len; i++) {
a = (a + (buf[i] & 0xff)) % MOD_ADLER; // <<=== Why & 0xff ?
b = (b + a) % MOD_ADLER;
}
}
我不明白需要与0xff
asbuf[i]
已经是 8 个字节,我知道它将被提升为int
as a
is int
,但类型提升不应该改变byte
. 可能是我遗漏了更多细节,因为没有它就无法工作& 0xff
,我用计算的值对其进行了测试java.util.zip.Adler32
感谢您的回答,但是它只对导致负数的值很重要,例如在我的测试中
byte a = -4;
int n1 = a & 0xff;
int n2 = a;
out.printf(" a %4d %s\n", a,Integer.toBinaryString(a));
out.printf("n1 %4d %s\n",n1,Integer.toBinaryString(n1));
out.printf("n2 %4d %s\n",n2,Integer.toBinaryString(n2));
印刷
a -4 11111111111111111111111111111100
n1 252 11111100
n2 -4 11111111111111111111111111111100