興味深いことに、C# を除くほぼすべての言語でインターネット チェックサムの実装を見つけることができます。誰かが共有する実装を持っていますか?
インターネット プロトコルでは、次のことが指定されていることに注意してください。
「チェックサム フィールドは、ヘッダー内のすべての 16 ビット ワードの 1 の補数の合計の 16 ビットの 1 の補数です。チェックサムを計算する目的で、チェックサム フィールドの値はゼロです。」
Dr. Mathから詳細な説明が得られます。
利用可能な効率の指標がいくつかありますが、現時点では、それは私にとって大きな懸念事項ではありません。
あなたのテストを含めてください!(編集: 他の誰かのコードのテストに関する有効なコメント - しかし、私はプロトコルから外れており、独自のテスト ベクトルを持っていないため、現在使用されているものと一致するかどうかを確認するために、運用環境に置くよりも単体テストを行いたいと考えています! ;-)
編集:ここに私が思いついたいくつかの単体テストがあります。バイト コレクション全体を反復処理する拡張メソッドをテストします。テストで問題が見つかった場合はコメントしてください。
[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);
}