IEEE 802.3イーサネットフレームのカプセル化を実装するプログラムを作成します。
インターフェイスを描画する必要があり、データパーツ、ソースMACアドレス、およびイーサネットフレームの宛先MACアドレスはインターフェイスから入力されます。
計算されたチェックサムフィールドとカプセル化された結果は、インターフェイスから出力できます。
多項式G(x)= x8+x2+x+1を生成します。
使用されるオペレーティングシステム、言語、編集環境は制限されていませんが、レポートには注意する必要があります。
CRC計算プロセスを視覚化できます。
インターフェイスからプログラムの操作を制御する機能。
802.3標準に従ってフレーム構造を次の表に示します(802.3標準のイーサネットフレーム構造は7つの部分で構成されています)
802.3標準フレーム構造
| リードコード | プレフレームデリミッター | 宛先アドレス | ソースアドレス | 長さフィールド | データフィールド | 検証フィールド |
|---|---|---|---|---|---|---|
| 7b | 1b | (6b) | (6b) | (2b) | (可変長) | (4b) |
その中で、フレームデータフィールドの最小長は46Bです。フレームが46B未満の場合、データフィールドは46Bに埋める必要があります。パディングキャラクターは任意であり、長さのフィールド値にはカウントされません。
チェックフィールドでは、CRCチェックが使用されます。検証の範囲には、宛先アドレスフィールド、ソースアドレスフィールド、長さフィールド、およびLLCデータフィールドが含まれます。
ビジュアルインターフェイスを使用して、ユーザーが入力した宛先アドレス、ソースアドレス、長さフィールド、およびデータフィールドを受信します。また、ユーザー入力を減らすことができるランダムデータの生成もサポートしています
生成された多項式を使用して、チェックするデータの検証フィールドを計算します。チェックするフィールドは整数バイトで、生成された多項式の順序は32を超えず、計算された残りは4バイトです。
Windows 10計算機のビット入力キーボードを模倣し、ユーザーがマウスをクリックして多項式やその他のデータを入力および生成できるようにします
FCSの計算後のフレームは受信機に発生し、レシーバーはエラーがあるかどうかを確認できます。データを手動で変更したり、エラーがあるかどうかを確認するなど、エラーをシミュレートできます。
短いバイナリデータを使用して、CRC計算プロセスとサポート検証機能を動的に表示します。各ステップの遅延時間は、表示速度を制御するためにカスタマイズでき、プレゼンテーションはいつでも停止できます。
次の式によると
得ることができます
つまり、数n回拡張して、残りを追加します。この時点で、$$ mod m $$の残りは変更されていません

private byte [ ] CalcCRC ( string v )
{
var data = new Queue < char > ( v . ToArray ( ) ) ; // 被除数
char [ ] divisor = binaryString . ToArray ( ) ; // 除数
Queue < char > S = new Queue < char > ( ) ; // 商
int width = divisor . Length ; // 每次取 width 个字符进行异或运算
Queue < char > str = new Queue < char > ( ) ; // 每次取的长度为 width 的部分被除数
// 获取前 width - 1 个字符,填入到str中
for ( int i = 0 ; i < width - 1 ; i ++ )
{
str . Enqueue ( data . Dequeue ( ) ) ;
}
while ( data . Count != 0 )
{
str . Enqueue ( data . Dequeue ( ) ) ;
if ( str . First ( ) == '0' )
{
S . Enqueue ( '0' ) ;
str . Dequeue ( ) ;
}
else
{
S . Enqueue ( '1' ) ;
var temp = str . ToArray ( ) ;
str . Clear ( ) ;
for ( int i = 1 ; i < temp . Length ; i ++ )
{
str . Enqueue ( temp [ i ] == divisor [ i ] ? '0' : '1' ) ;
}
}
}
// 计算已经结束,str中的值就是结果,下面的代码可以不用看了
// 将str中的值转成4个字节的二进制数组
var res = new string ( str . ToArray ( ) ) . PadLeft ( 32 , '0' ) ;
var result = new byte [ 4 ] ;
// 将字符串格式化为byte
for ( int i = 0 ; i < 4 ; i ++ )
{
result [ i ] = Convert . ToByte ( res . Substring ( i * 8 , 8 ) , 2 ) ;
}
return result ;
}保留中のデータ:1010 0111 0110 0
多項式を生成する:1010 1101 0(
保留中のすべてのデータをキューdataに入れます
data = [1010011101100]
9ビットの多項式を生成するため、最初にキューdataの最初の8項目を削除し、キューstrにデータを入力します
str = [10100111]
data = [01100]
キューdata.Count = 5 != 0、実行を続行します
キューdataの最初のアイテムをdequeueして、キューstrに入れます
str = [101001110]
data = [1100]
strの最初の要素は1です
Sに1挿入します
キューstrの値と生成された多項式の値のビットワイズ排他的または値を実行し、結果の最後の8文字をstr 101001110 ^ 10101101010 = 000010100にコピーします
S = [1]
str = [00010100]
data = [1100]
キューdata.Count = 4 != 0、実行を続行します
キューdataの最初のアイテムをdequeueして、キューstrに入れます
S = [1]
str = [000101001]
data = [100]
strの最初の要素は0です
0列Sに挿入し、 strの最初のアイテムをdequeueとします
S = [10]
str = [00101001]
data = [100]
キューdata.Count = 3 != 0、実行を続行します
キューdataの最初のアイテムをdequeueして、キューstrに入れます
S = [10]
str = [001010011]
data = [00]
strの最初の要素は0です
0列Sに挿入し、 strの最初のアイテムをdequeueとします
S = [100]
str = [01010011]
data = [00]
キューdata.Count = 2 != 0、実行を続行します
キューdataの最初のアイテムをdequeueして、キューstrに入れます
S = [100]
str = [010100110]
data = [0]
strの最初の要素は0です
0列Sに挿入し、 strの最初のアイテムをdequeueとします
S = [1000]
str = [10100110]
data = [0]
キューdata.Count = 1 != 0、実行を続行します
キューdataの最初のアイテムをdequeueして、キューstrに入れます
S = [1000]
str = [101001100]
data = []
strの最初の要素は1です
Sに1挿入します
キューstrの値と生成された多項式の値のビットワイズ排他的または除外を実行し、結果の最後の8文字をstr 101001100 ^ 10101101010 = 000010110にコピーします
S = [10001]
str = [00010110]
data = []
キューdata.Count = 0 == 0、end、残りはstr = 00010110 、商はS = 10001です
計算プロセス全体は次のとおりです。







