BSD checksum 和 bits 操作解释
BSD checksum and bits operations explanation
我试着理解BSD校验和计算算法,用Java语言写的。
维基写道:
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;
}
还有我的问题:
- 为什么我们在这一行中使用按位 & checksum = (byte) ((checksum + cur_byte) & 0xFF); ? 0xFF 是二进制“11111111”,这个操作不是 return 总是这个相同的数字吗?
- 这个操作是什么感觉?校验和 = (字节) (((校验和 & 0xFF) >>> 1) + ((校验和 & 0x1) << 7));我懂二进制运算和逻辑和算术移位,但不明白我们在做什么。
感谢您的帮助:)
b & 0xFF 通常用于将有符号字节转换为位相同的 int。在这种情况下,它是不必要的 - (byte)(b & 0xFF) 与 (b) 相同。例如 ((byte)-1) & 0xFF = 255
12345678 >>>1 01234567
12345678 <<7 80000000 添加 -> 81234567
如此循环
我试着理解BSD校验和计算算法,用Java语言写的。
维基写道:
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;
}
还有我的问题:
- 为什么我们在这一行中使用按位 & checksum = (byte) ((checksum + cur_byte) & 0xFF); ? 0xFF 是二进制“11111111”,这个操作不是 return 总是这个相同的数字吗?
- 这个操作是什么感觉?校验和 = (字节) (((校验和 & 0xFF) >>> 1) + ((校验和 & 0x1) << 7));我懂二进制运算和逻辑和算术移位,但不明白我们在做什么。
感谢您的帮助:)
b & 0xFF 通常用于将有符号字节转换为位相同的 int。在这种情况下,它是不必要的 - (byte)(b & 0xFF) 与 (b) 相同。例如 ((byte)-1) & 0xFF = 255
12345678 >>>1 01234567
12345678 <<7 80000000 添加 -> 81234567
如此循环