首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >adler32按位和输入的java

adler32按位和输入的java
EN

Stack Overflow用户
提问于 2014-02-19 19:03:09
回答 1查看 176关注 0票数 0

我在这里找到了adler32的代码http://developer.classpath.org/doc/java/util/zip/Adler32-source.html

但是,我的更新代码如下

代码语言:javascript
复制
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;
    }
}

作为链接上的反对代码

代码语言:javascript
复制
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,因为buf[i]已经是8个字节,我知道它将被提升到int作为a is int,但是类型提升不应该在byte中改变值。也许我遗漏了更多的细节,因为没有& 0xff它就不能工作,我用java.util.zip.Adler32计算的值测试了它

谢谢你的回答,但只有在我的测试中,结果是负数的值才重要。

代码语言:javascript
复制
    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));

版画

代码语言:javascript
复制
  a   -4 11111111111111111111111111111100
 n1  252 11111100
 n2   -4 11111111111111111111111111111100
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-19 19:17:16

问题是byte是用Java签名的。因此,自动类型提升byte -> int总是在范围内给出一个整数(-128,127),而不是我们想要的(0,255)。& 0xff操作修复了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21889899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档