Berechnen eines Internet (auch bekannt als IP, auch bekannt als RFC791) Prüfsumme in C #

StackOverflow https://stackoverflow.com/questions/2188060

  •  25-09-2019
  •  | 
  •  

Frage

Interessanterweise kann ich Implementierungen für das Internet-Prüfsumme in fast allen Sprachen außer C # finden. Hat jemand eine Implementierung Anteil hat?

Denken Sie daran, das Internet-Protokoll gibt an, dass:

"Das Prüfsumme Feld ist der 16-Bit ist eine Ergänzung der eigenen     Ergänzung Summe aller 16-Bit-Wörter in der Kopfzeile. Für die Zwecke der     die Berechnung der Prüfsumme, ist der Wert der Prüfsumme Feld Null. "

Weitere Erklärungen können von Dr. finden Math .

Es gibt einige Effizienz Zeiger zur Verfügung, aber das ist nicht wirklich ein großes Problem für mich an dieser Stelle.

Bitte geben Sie Ihre Tests! (Edit: Gültiger Kommentar in Bezug auf die Prüfung von jemand anderem Code - aber ich werde des Protokolls ab und haben keine Testvektoren meiner eigenen und würde eher Unit-Test es als in Produktion zu sehen, ob es passt, was gerade verwendet wird! ; -)

Edit: Hier sind einige Unit-Tests, dass ich kam mit. Sie testen ein Verlängerungsverfahren, welches die gesamte Byte-Sammlung durchläuft. Bitte Kommentar, wenn Sie Fehler in den Tests finden.

[TestMethod()]
public void InternetChecksum_SimplestValidValue_ShouldMatch()
{
    IEnumerable<byte> value = new byte[1]; // should work for any-length array of zeros
    ushort expected = 0xFFFF;

    ushort actual = value.InternetChecksum();

    Assert.AreEqual(expected, actual);
}

[TestMethod()]
public void InternetChecksum_ValidSingleByteExtreme_ShouldMatch()
{
    IEnumerable<byte> value = new byte[]{0xFF};
    ushort expected = 0xFF;

    ushort actual = value.InternetChecksum();

    Assert.AreEqual(expected, actual);
}

[TestMethod()]
public void InternetChecksum_ValidMultiByteExtrema_ShouldMatch()
{
    IEnumerable<byte> value = new byte[] { 0x00, 0xFF };
    ushort expected = 0xFF00;

    ushort actual = value.InternetChecksum();

    Assert.AreEqual(expected, actual);
}
War es hilfreich?

Lösung 2

Nun, grub ich eine Implementierung von einer alten Code-Basis und es gibt die Tests, die ich in der Frage angegeben, so ist es hier (als Erweiterung Methode):

public static ushort InternetChecksum(this IEnumerable<byte> value)
{
    byte[] buffer = value.ToArray();
    int length = buffer.Length;
    int i = 0;
    UInt32 sum = 0;
    UInt32 data = 0;
    while (length > 1)
    {
        data = 0;
        data = (UInt32)(
        ((UInt32)(buffer[i]) << 8)
        |
        ((UInt32)(buffer[i + 1]) & 0xFF)
        );

        sum += data;
        if ((sum & 0xFFFF0000) > 0)
        {
            sum = sum & 0xFFFF;
            sum += 1;
        }

        i += 2;
        length -= 2;
    }

    if (length > 0)
    {
        sum += (UInt32)(buffer[i] << 8);
        //sum += (UInt32)(buffer[i]);
        if ((sum & 0xFFFF0000) > 0)
        {
            sum = sum & 0xFFFF;
            sum += 1;
        }
    }
    sum = ~sum;
    sum = sum & 0xFFFF;
    return (UInt16)sum;
}

Andere Tipps

Ich wusste, dass ich diese irgendwo gespeichert hatte weg ... http://cyb3rspy.wordpress.com / 2008/03/27 / ip-header-Prüfsumme-Funktion-in-c /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top