Escriba programas para implementar la encapsulación IEEE 802.3 Ethernet Frame.
Se requiere dibujar la interfaz, y la parte de datos, la dirección MAC de origen y la dirección MAC de destino de la trama Ethernet se ingresan desde la interfaz;
El campo de suma de verificación calculada y el resultado encapsulado se pueden emitir desde la interfaz;
Generar polinomio G (x) = x8+x2+x+1;
El sistema operativo, el lenguaje y el entorno de compilación utilizado no se limitan, sino que debe tenerse en cuenta en el informe.
Capaz de visualizar el proceso de cálculo de CRC;
Capacidad para controlar el funcionamiento del programa desde la interfaz.
La estructura de cuadro de acuerdo con el estándar 802.3 se muestra en la siguiente tabla (la estructura de marco Ethernet del estándar 802.3 consta de 7 partes)
802.3 Estructura de marco estándar
| Código principal | Delimitador previo al marco | Dirección de destino | Dirección fuente | Campo de longitud | Campos de datos | Campo de verificación |
|---|---|---|---|---|---|---|
| 7b | 1B | (6b) | (6b) | (2b) | (Longitud variable) | (4B) |
Entre ellos, la longitud mínima del campo de datos de cuadro es 46B. Si el marco tiene menos de 46B, el campo de datos debe llenarse a 46B. El personaje del relleno es arbitrario y no cuenta con el valor de campo de longitud.
En el campo de verificación, se utiliza la verificación CRC. El alcance de la verificación incluye el campo de dirección de destino, el campo de dirección de origen, el campo de longitud y el campo de datos LLC.
Use una interfaz visual para recibir la dirección de destino, la dirección de origen, el campo de longitud y el campo de datos ingresado por el usuario. También admite la generación de datos aleatorios, que pueden reducir la entrada del usuario
Use el polinomio generado para calcular el campo de verificación de los datos a verificar. El campo a verificar es un byte entero, el orden del polinomio generado no excede 32, y el resto calculado es de 4 bytes.
Imitando el teclado de entrada de bits de la calculadora de Windows 10, lo que permite a los usuarios ingresar y generar polinomios y otros datos haciendo clic en el mouse
El cuadro después del cálculo de FCS se produce al receptor, y el receptor puede verificar si hay un error. Puede simular errores, como modificar manualmente los datos y luego verificar si hay un error.
Utilizando datos binarios más cortos, muestre dinámicamente el proceso de cálculo de CRC y la función de verificación de soporte. El tiempo de retraso de cada paso se puede personalizar para controlar la velocidad de visualización y la presentación se puede detener en cualquier momento.
Según la siguiente fórmula
Puede obtener
Es decir, expandir varias veces y luego agregar el resto. En este momento, el resto de $$ mod m $$ permanece sin cambios

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 ;
}Datos pendientes: 1010 0111 0110 0
Generar polinomio: 1010 1101 0 (
Poner todos los datos pendientes en data de la cola
data = [1010011101100]
Genere un polinomio de 9 bits, por lo que primero deje que los primeros 8 ítems de data de la cola se endulzen y coloque los datos en la cola str
str = [10100111]
data = [01100]
Cola data.Count = 5 ! = 0, continuar con la ejecución
Dequeue el primer elemento de los data de la cola y póngalo en la cola str
str = [101001110]
data = [1100]
El primer elemento de str es 1
Insertar 1 en la columna S
Realice un bit a bit Exclusive o del valor de la cola str y el valor del polinomio generado, y copie los últimos 8 caracteres del resultado a str 101001110 ^ 10101101010 = 000010100
S = [1]
str = [00010100]
data = [1100]
Cola data.Count = 4 ! = 0, continuar la ejecución
Dequeue el primer elemento de los data de la cola y póngalo en la cola str
S = [1]
str = [000101001]
data = [100]
El primer elemento de str es 0
Inserte 0 en la columna S y deje que el primer elemento de str enqueue
S = [10]
str = [00101001]
data = [100]
Cola data.Count = 3 ! = 0, continuar la ejecución
Dequeue el primer elemento de los data de la cola y póngalo en la cola str
S = [10]
str = [001010011]
data = [00]
El primer elemento de str es 0
Inserte 0 en la columna S y deje que el primer elemento de str enqueue
S = [100]
str = [01010011]
data = [00]
Cola data.Count = 2 ! = 0, continuar con ejecución
Dequeue el primer elemento de los data de la cola y póngalo en la cola str
S = [100]
str = [010100110]
data = [0]
El primer elemento de str es 0
Inserte 0 en la columna S y deje que el primer elemento de str enqueue
S = [1000]
str = [10100110]
data = [0]
Cola data.Count = 1 ! = 0, continuar con ejecución
Dequeue el primer elemento de los data de la cola y póngalo en la cola str
S = [1000]
str = [101001100]
data = []
El primer elemento de str es 1
Insertar 1 en la columna S
Realice bit a bit Exclusive o del valor de la cola str y el valor del polinomio generado, y copie los últimos 8 caracteres del resultado a str 101001100 ^ 10101101010 = 000010110
S = [10001]
str = [00010110]
data = []
data.Count = 0 == 0, final, el resto es str = 00010110 , el cociente es S = 10001
Todo el proceso de cálculo es:







