Jam*_*oux 4 c# bitwise-operators
我实现了我发现的这个校验和算法,它工作正常,但我无法弄清楚这个"&= 0xFF"行实际上在做什么.
我查找了bitwise&运算符,并且维基百科声称它是A与B中所有位的逻辑AND.我还读到0xFF相当于255 - 这应该意味着所有位都是1.如果你接受任何位数字和0xFF,这不是数字的身份吗?所以A&0xFF产生A,对吗?
所以我想,等一下,下面代码中的校验和是32位Int,但0xFF是8bit.这是否意味着校验和&= 0xFF的结果是24位最终为零并且只保留剩余的8位?在这种情况下,校验和被截断为8位.那是怎么回事?
private int CalculateChecksum(byte[] dataToCalculate)
{
int checksum = 0;
for(int i = 0; i < dataToCalculate.Length; i++)
{
checksum += dataToCalculate[i];
}
//What does this line actually do?
checksum &= 0xff;
return checksum;
}
Run Code Online (Sandbox Code Playgroud)
此外,如果结果被截断为8位,那是因为32位在校验和中是没有意义的吗?当8位校验和没有时,是否有可能出现32位校验和捕获损坏数据的情况?
它掩盖了较高的字节,只留下较低的字节.
checksum &= 0xFF;
Run Code Online (Sandbox Code Playgroud)
在语法上是短的:
checksum = checksum & 0xFF;
Run Code Online (Sandbox Code Playgroud)
其中,由于它正在进行整数运算,因此0xFF将其扩展为int:
checksum = checksum & 0x000000FF;
Run Code Online (Sandbox Code Playgroud)
哪个屏蔽了高3字节,并将低字节作为整数(不是字节)返回.
回答你的另一个问题:由于32位校验和比8位校验和宽得多,它可以捕获8位校验和不会发生的错误,但是双方都需要使用相同的校验和计算才能工作.