원시 패킷을 작성하여 튜토리얼 this 다음에 보내주는 방법을 배우고 있습니다. 체크섬이 생성 된 코드에 도달하기 전까지는 모든 것이 의미가 있습니다.체크섬 및 비트 시프트
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