Adler32 Java 按位和输入



我在这里找到了 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;
    }
}

我不明白需要 AND 与 0xff 因为buf[i]已经是 8 个字节,我知道它会随着a int而被提升为 int,但类型提升不应该改变 byte 中的值。可能是我错过了一些更多细节,因为它在没有& 0xff的情况下不起作用,我用 java.util.zip.Adler32 计算的值对其进行了测试

感谢您的回答,但是它只对导致负数的值很重要,例如在我的测试中

    byte a = -4;
    int n1 = a & 0xff;
    int n2 = a;
    out.printf(" a %4d %sn", a,Integer.toBinaryString(a));
    out.printf("n1 %4d %sn",n1,Integer.toBinaryString(n1));
    out.printf("n2 %4d %sn",n2,Integer.toBinaryString(n2));

指纹

  a   -4 11111111111111111111111111111100
 n1  252 11111100
 n2   -4 11111111111111111111111111111100

问题是byte是用Java签名的。因此,自动类型升级 byte -> int 将始终给出 (-128,127) 范围内的整数,而不是 (0,255),正如我们想要的那样。& 0xff操作解决了这个问题。

相关内容

  • 没有找到相关文章

最新更新