16 Bit IP Checksumme berechnen



  • Hallo,
    ich habe in einem String den Header von einem IP-Paket.
    um an Pos 11 und 12 die IP-Checksumme eintragen zu können, brauche ich eine Berechnungsfunktion.
    Mit der Beispielfunktion von

    www.netfor2.com/ipsum.htm

    komme ich wegen meinem unglücklichen Zahlenformat nicht weiter.

    Ich habe:
    -----------------
    char Puffer[60];
    strcpy (Puffer, "45 00 0a 0a 0a 0a 40 00 0a 06 00 00 c0 a8 06 02 c0 a8 06 05");
    ------------------
    bringt mir eine Umwandlung mit "StrTointEX" etwas?



  • sscanf kann dir helfen 🙄 😉

    USHORT IpCrc16(char* Buffer, int iLenght)
    {
    	UINT uSum = 0, uFirst, uNext;
    	char sz[6] = {0};
    
    	for (int i = 0; i < iLenght; i += 6) {
    		sz[0] = Buffer[i], sz[1] = Buffer[i + 1];
    		sz[3] = Buffer[i + 3], sz[4] = Buffer[i + 4];
    
    		::sscanf(sz,"%02x",&uFirst), ::sscanf(sz + 3,"%02x",&uNext);
    		uSum += ((uFirst << 8) & 0xff00) + (uNext & 0xff);
    	}
    
    	while (uSum >> 16)
    		uSum = (uSum & 0xffff) + (uSum >> 16);
    
    	uSum = ~uSum;
    	return uSum & 0xffff;
    }
    


  • Vielen Dank,
    die Funktion klappt super.
    Kann ich die Funktion auch für die TCP Checksumme nutzen?
    Die Funktion auf www.netfor2.com/tcpsum.htm schein die ganze Aufgabe einfach nur Scheibenweise zu erzeugen oder?
    Mehrfach die Summe bilden und am Ende das Komplement?



  • richtig, die Vorgehensweise ist genau die selbe. 😉


Anmelden zum Antworten