Tulis program untuk mengimplementasikan enkapsulasi bingkai Ethernet IEEE 802.3.
Diperlukan untuk menggambar antarmuka, dan bagian data, alamat MAC sumber, dan alamat MAC tujuan dari bingkai Ethernet adalah input dari antarmuka;
Bidang checksum yang dihitung dan hasil yang dienkapsulasi dapat output dari antarmuka;
Menghasilkan polinomial g (x) = x8+x2+x+1;
Sistem operasi, lingkungan dan lingkungan kompilasi yang digunakan tidak terbatas, tetapi harus dicatat dalam laporan.
Dapat memvisualisasikan proses perhitungan CRC;
Kemampuan untuk mengontrol pengoperasian program dari antarmuka.
Struktur bingkai sesuai dengan standar 802.3 ditunjukkan pada tabel berikut (struktur bingkai Ethernet dari standar 802.3 terdiri dari 7 bagian)
802.3 Struktur bingkai standar
| Kode utama | Pembatas pra-bingkai | Alamat tujuan | Alamat sumber | Bidang panjang | Bidang data | Bidang verifikasi |
|---|---|---|---|---|---|---|
| 7b | 1b | (6b) | (6b) | (2b) | (Panjang variabel) | (4b) |
Di antara mereka, panjang minimum bidang data bingkai adalah 46b. Jika bingkai memiliki kurang dari 46b, bidang data harus diisi hingga 46b. Karakter padding sewenang -wenang dan tidak dihitung dengan nilai bidang panjang.
Di bidang cek, pemeriksaan CRC digunakan. Lingkup verifikasi mencakup bidang alamat tujuan, bidang alamat sumber, bidang panjang, dan bidang data LLC.
Gunakan antarmuka visual untuk menerima alamat tujuan, alamat sumber, bidang panjang, dan bidang data yang dimasukkan oleh pengguna. Ini juga mendukung pembuatan data acak, yang dapat mengurangi input pengguna
Gunakan polinomial yang dihasilkan untuk menghitung bidang verifikasi data yang akan diperiksa. Bidang yang akan diperiksa adalah byte integer, urutan polinomial yang dihasilkan tidak melebihi 32, dan sisanya yang dihitung adalah 4 byte.
Meniru keyboard input bit dari windows 10 calculator, memungkinkan pengguna untuk memasukkan dan menghasilkan polinomial dan data lainnya dengan mengklik mouse
Bingkai setelah perhitungan FCS terjadi pada penerima, dan penerima dapat memverifikasi apakah ada kesalahan. Anda dapat mensimulasikan kesalahan, seperti memodifikasi data secara manual dan kemudian memverifikasi apakah ada kesalahan.
Menggunakan data biner yang lebih pendek, secara dinamis menampilkan proses perhitungan CRC dan fungsi verifikasi dukungan. Waktu tunda setiap langkah dapat disesuaikan untuk mengontrol kecepatan tampilan dan presentasi dapat dihentikan kapan saja.
Menurut formula berikut
Bisa mendapatkan
Yaitu, perluas angka n kali, dan kemudian tambahkan sisanya. Pada saat ini, sisa $$ mod M $$ tetap tidak berubah

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 ;
}Data yang tertunda: 1010 0111 0110 0
Menghasilkan polinomial: 1010 1101 0 (
Masukkan semua data yang tertunda ke dalam data antrian
data = [1010011101100]
Hasilkan polinomial 9 bit, jadi pertama -tama biarkan 8 item pertama dari data antrian dequeued dan masukkan data ke dalam antrian str
str = [10100111]
data = [01100]
data.Count = 5 ! = 0, lanjutkan eksekusi
Dequeue Item pertama dari data antrian dan masukkan ke dalam antrian str
str = [101001110]
data = [1100]
Elemen pertama str adalah 1
Masukkan 1 ke dalam kolom S
Lakukan bitwise eksklusif atau nilai streue str dan nilai polinomial yang dihasilkan, dan salin 8 karakter terakhir dari hasil ke str 101001110 ^ 10101101010 = 000010100
S = [1]
str = [00010100]
data = [1100]
Antrian data.Count = 4 ! = 0, lanjutkan eksekusi
Dequeue Item pertama dari data antrian dan masukkan ke dalam antrian str
S = [1]
str = [000101001]
data = [100]
Elemen pertama str adalah 0
Masukkan 0 ke kolom S dan biarkan item pertama str Dequeue
S = [10]
str = [00101001]
data = [100]
Antrian data.Count = 3 ! = 0, lanjutkan eksekusi
Dequeue Item pertama dari data antrian dan masukkan ke dalam antrian str
S = [10]
str = [001010011]
data = [00]
Elemen pertama str adalah 0
Masukkan 0 ke kolom S dan biarkan item pertama str Dequeue
S = [100]
str = [01010011]
data = [00]
Antrian data.Count = 2 ! = 0, lanjutkan eksekusi
Dequeue Item pertama dari data antrian dan masukkan ke dalam antrian str
S = [100]
str = [010100110]
data = [0]
Elemen pertama str adalah 0
Masukkan 0 ke kolom S dan biarkan item pertama str Dequeue
S = [1000]
str = [10100110]
data = [0]
Antrian data.Count = 1 ! = 0, lanjutkan eksekusi
Dequeue Item pertama dari data antrian dan masukkan ke dalam antrian str
S = [1000]
str = [101001100]
data = []
Elemen pertama str adalah 1
Masukkan 1 ke dalam kolom S
Lakukan bitwise eksklusif atau nilai streue str dan nilai polinomial yang dihasilkan, dan salin 8 karakter terakhir dari hasil ke str 101001100 ^ 10101101010 = 000010110
S = [10001]
str = [00010110]
data = []
Antrian data.Count = 0 == 0, end, sisanya adalah str = 00010110 , hasil bagi S = 10001
Seluruh proses perhitungan adalah:







