Интересно, что я могу найти реализации Internet Checksum почти на всех языках, кроме C#. У кого-нибудь есть реализация, которой можно поделиться?
Помните, что интернет-протокол указывает следующее:
«Поле контрольной суммы представляет собой 16-битное дополнение до единицы суммы всех 16-битных слов в заголовке. Для целей вычисления контрольной суммы значение поля контрольной суммы равно нулю».
Дополнительные пояснения можно найти у Dr. Математика.
Есть некоторые указатели эффективности доступны, но на данный момент меня это не очень беспокоит.
Пожалуйста, включите ваши тесты! (Редактировать: Действительный комментарий относительно тестирования чужого кода, но я выхожу из протокола, у меня нет собственных тестовых векторов, и я предпочел бы его модульное тестирование, а не запуск в производство, чтобы увидеть, соответствует ли он тому, что используется в настоящее время! ;-)
Изменить: вот несколько модульных тестов, которые я придумал. Они тестируют метод расширения, который перебирает всю коллекцию байтов. Пожалуйста, прокомментируйте, если вы обнаружите ошибки в тестах.
[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);
}