BSD校验和和位操作说明

时间:2015-01-16 20:32:10

标签: java checksum bsd

我尝试了解BSD校验和计算算法,用Java语言编写。

Wiki写道:

byte checksum(byte[] input) {
byte checksum = 0;
for (byte cur_byte: input) {
    checksum = (byte) (((checksum & 0xFF) >>> 1) + ((checksum & 0x1) << 7)); // Rotate the accumulator
checksum = (byte) ((checksum + cur_byte) & 0xFF);                        // Add the next chunk
}
return checksum; 

}

我的问题:

  1. 为什么我们使用bitwise&amp;在这一行中校验和=(字节)((校验和+ cur_byte)&amp; 0xFF); ? 0xFF是二进制“11111111”,此操作不会始终返回相同的数字?
  2. 这种操作有什么意义?校验和=(字节)(((校验和&amp; 0xFF)&gt;&gt;&gt; 1)+((校验和&amp; 0x1)&lt;&lt; 7));我理解二元操作和逻辑和算术转换,但不明白我们在做什么。
  3. 感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

  1. b&amp; 0xFF通常用于将带符号的字节转换为位相同的int。在这种情况下,不需要 - (字节)(b&amp; 0xFF)与(b)相同。例如((byte)-1)&amp; 0xFF = 255

  2. 12345678&gt;&gt;&gt; 1 01234567
    12345678&lt;&lt; 7 80000000 ADD - &gt; 81234567

  3. 因此它是循环旋转