![]() |
| ||
| C++ to Delphi CheckSum code typedef struct iphdr { u_char ip_hl:4, /* header length */ ip_v:4; /* version */ u_char ip_tos; /* type of service */ short ip_len; /* total length */ u_short ip_id; /* identification */ short ip_off; /* fragment offset field */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ } iphdr, *iphdr_ptr; VOID RecalculateIPChecksum ( iphdr_ptr pIpHeader ) { unsigned short word16; unsigned int sum = 0; unsigned int i = 0; PUCHAR buff; // Initialize checksum to zero pIpHeader->ip_sum = 0; buff = (PUCHAR)pIpHeader; // Calculate IP header checksum for (i = 0; i < pIpHeader->ip_hl*sizeof(DWORD); i=i+2) { word16 = ((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF); sum = sum+word16; } // keep only the last 16 bits of the 32 bit calculated sum and add the carries while (sum>>16) sum = (sum & 0xFFFF)+(sum >> 16); // Take the one's complement of sum sum = ~sum; pIpHeader->ip_sum = htons((unsigned short) sum); } |
| ||
| Re: C++ to Delphi CheckSum code That C code is a mess. And it is dangerous because it uses bitfields (which C++ does not guarantee to be packed in any specific order -- so results vary by compiler!). Alas, why don't programmers stp usng stpd shrt nonsns nms. Anyway: uses The above code presumes the following:
Enjoy! |
| ||
| Re: C++ to Delphi CheckSum code Thank you so much. This gives me a lot of help with other peaces of code. Ray |
| All times are GMT -4. The time now is 11:18 pm. |
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC