Berechnen eines Internet (auch bekannt als IP, auch bekannt als RFC791) Prüfsumme in C #
-
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);
}
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 /