【问题标题】:BSD checksum and bits operations explanationBSD校验和和位操作说明
【发布时间】:2015-01-16 20:32:10
【问题描述】:

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

维基写道:

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. 为什么我们在这一行使用按位 & checksum = (byte) ((checksum + cur_byte) & 0xFF); ? 0xFF 是二进制“11111111”,这个操作不总是返回这个相同的数字吗?
  2. 这个操作有什么意义?校验和 = (字节) (((校验和 & 0xFF) >>> 1) + ((校验和 & 0x1)

感谢您的帮助:)

【问题讨论】:

    标签: java checksum bsd


    【解决方案1】:
    1. b & 0xFF 通常用于将有符号字节转换为位相同的 int。在这种情况下,不需要 - (byte)(b & 0xFF) 与 (b) 相同。例如 ((byte)-1) & 0xFF = 255

    2. 12345678 >>>1 01234567
      12345678   81234567

    所以是循环旋转

    【讨论】:

      猜你喜欢
      • 2022-11-26
      • 1970-01-01
      • 2014-08-31
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多