2014-02-19 39 views
0

的我發現的Adler32這裏的代碼http://developer.classpath.org/doc/java/util/zip/Adler32-source.html的Adler32 Java的逐位和輸入

但是我更新的代碼看起來像下面

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作爲buf[i]已經是8個字節,據我所知它會被提升爲int作爲aint,仍然該類型的促銷不應改變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 
+0

可能重複[在Java中值是什麼&0xff?](http://stackoverflow.com/questions/11380062/what-does-value-0xff-do-in-java) – leonbloy

回答

0

的問題是,byte是用Java簽名。因此,自動類型促銷byte - >int將始終給出範圍(-128,127)中的整數,而不是(0,255),如我們所願。 & 0xff操作修復了這一問題。

+0

感謝您的答案,然而它只會對負值產生影響 – user3307582

+0

我不確定你是否完全理解了這個問題。一個字節只是一個八位位組,它可以被解釋爲一個整數(有符號或無符號值)。例如,如果字節來自二進制文件(可執行文件,圖像),並將它們存儲在Java'byte []'中,則其中大約一半(MSB中含1的字節)將爲「負數」。 – leonbloy