校验和中的"int&= 0xFF"有什么作用?

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位校验和捕获损坏数据的情况?

Ron*_*yer 8

它掩盖了较高的字节,只留下较低的字节.

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位校验和不会发生的错误,但是双方都需要使用相同的校验和计算才能工作.


小智 5

好像你对情况有很好的了解.

这是否意味着校验和&= 0xFF的结果是24位最终为零并且只保留剩余的8位?

是.

当8位校验和没有时,是否有可能出现32位校验和捕获损坏数据的情况?

是.