2015-09-04 69 views
0

对不起,如果这听起来很混乱,但我有一个GPS导航单元,通过UDP发送72字节的数据包。根据GPS手册,72字节数据包的第22个字节是迄今为止验证数据包完整性的第一个校验和。我被告知需要将前21个字节的值相加,并将该答案的最低字节与校验和进行比较。如果这些值匹配,那么数据包到目前为止是有效的。获取增加值的最低字节

要做到这一点,我写C++代码,添加第21个字节

checksum = ((unsigned char) buf[0] + (unsigned char) buf[1] + (unsigned char) buf[2] + (unsigned char) buf[3] + (unsigned char) buf[4] + (unsigned char) buf[5] + (unsigned char) buf[6] + (unsigned char) buf[7] + (unsigned char) buf[8] + (unsigned char) buf[9] + (unsigned char) buf[10] + (unsigned char) buf[11] + (unsigned char) buf[12] + (unsigned char) buf[13] + (unsigned char) buf[14] + (unsigned char) buf[15] + (unsigned char) buf[16] + (unsigned char) buf[17] + (unsigned char) buf[18] + (unsigned char) buf[19] + (unsigned char) buf[20] + (unsigned char) buf[21]) 

我的问题是:如何将我得到的这个最低的8位,所以我可以用字节22进行比较?

+0

您可以在C/C++中使用按位AND运算符。该运算符是'&'。为了获得最低8位,你可以用'0xff'和''校验和。所以你可以在你的表达式末尾添加“&0xff”(在最后一个关闭圆括号之外) –

+0

谢谢!这很好用 – oodan123

+0

您是否考虑使用循环来获取校验和? 'checksum = 0; for(int i = 0; i <22; ++ i)checksum + =(unsigned char)buf [i];' – john

回答

0

感谢Micheal Petch的评论我只需要将值与0xff取得最低的8位。

& 0xff;