有趣的是,我可以在除 C# 之外的几乎所有语言中找到 Internet 校验和的实现。有人有实现可以分享吗?
请记住,互联网协议 http://www.faqs.org/rfcs/rfc791.html规定:
“校验和字段是 16 位的 1 的补码
标头中所有 16 位字的补码和。出于以下目的
计算校验和时,校验和字段的值为零。”
更多解释可以从Dr. Math https://web.archive.org/web/20180209015039/http://mathforum.org/library/drmath/view/54379.html.
有一些可用,但目前这对我来说并不是一个大问题。
请包括您的测试! (编辑:关于测试其他人的代码的有效评论 - 但我将脱离协议并且没有自己的测试向量,并且宁愿对其进行单元测试而不是投入生产以查看它是否与当前使用的相匹配! ;-)
编辑:这是我想出的一些单元测试。他们测试了一种迭代整个字节集合的扩展方法。如果您在测试中发现错误,请发表评论。
[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);
}
我知道我把这个藏在某个地方了......http://cyb3rspy.wordpress.com/2008/03/27/ip-header-checksum-function-in-c/ http://cyb3rspy.wordpress.com/2008/03/27/ip-header-checksum-function-in-c/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)