我正在學習創建一個原始數據包,並按照this教程發送它。一切都很有意義,直到我到達生成校驗和的代碼。Checksum和Bitshift
unsigned short csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for (sum = 0; nwords > 0; nwords--)
sum += *buf++;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
return ~sum;
}
看起來他總結了緩衝區中的所有單詞。但是當我打到
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
我完全失去了。看起來他把所有的位都移位了,基本上丟棄了除結轉之外的所有位,然後將它加回到原來的總和中?爲什麼需要& 0xfff?畢竟,爲什麼要再添加進位?是因爲可能會有第二次執行?
這是正確的轉變 – prajmus
顯然腦停止工作(X – Wusiji