Escreva programas para implementar o encapsulamento do quadro Ethernet IEEE 802.3.
É necessário desenhar a interface e a parte dos dados, o endereço MAC de origem e o endereço MAC de destino do quadro Ethernet são inseridos da interface;
O campo calculado da soma de verificação e o resultado encapsulado podem ser emitidos a partir da interface;
Gerar polinomial g (x) = x8+x2+x+1;
O sistema operacional, o ambiente de linguagem e compilação usado não é limitado, mas deve ser observado no relatório.
Capaz de visualizar o processo de cálculo do CRC;
Capacidade de controlar a operação do programa a partir da interface.
A estrutura do quadro de acordo com o padrão 802.3 é mostrada na tabela a seguir (a estrutura da estrutura Ethernet do padrão 802.3 consiste em 7 partes)
802.3 Estrutura de quadro padrão
| Código de chumbo | Delimitador pré-quadro | Endereço de destino | Endereço de origem | Campo de comprimento | Campos de dados | Campo de verificação |
|---|---|---|---|---|---|---|
| 7b | 1b | (6b) | (6b) | (2b) | (Comprimento variável) | (4b) |
Entre eles, o comprimento mínimo do campo de dados de quadros é de 46b. Se o quadro tiver menos de 46b, o campo de dados deverá ser preenchido para 46b. O caractere de preenchimento é arbitrário e não conta com o valor do campo de comprimento.
No campo de verificação, a verificação do CRC é usada. O escopo da verificação inclui o campo de endereço de destino, o campo de endereço de origem, o campo de comprimento e o campo de dados LLC.
Use uma interface visual para receber o endereço de destino, o endereço de origem, o campo de comprimento e o campo de dados inseridos pelo usuário. Ele também suporta a geração de dados aleatórios, que podem reduzir a entrada do usuário
Use o polinômio gerado para calcular o campo de verificação dos dados a serem verificados. O campo a ser verificado é um byte inteiro, a ordem do polinomial gerado não excede 32, e o restante calculado é de 4 bytes.
IMITANDO O teclado de entrada de bit da calculadora do Windows 10, permitindo que os usuários instassem e gerem polinômios e outros dados clicando no mouse
O quadro após o cálculo do FCS ocorre com o receptor e o receptor pode verificar se há um erro. Você pode simular erros, como modificar manualmente os dados e verificar se há um erro.
Usando dados binários mais curtos, exiba dinamicamente o processo de cálculo do CRC e a função de verificação de suporte. O tempo de atraso de cada etapa pode ser personalizado para controlar a velocidade da exibição e a apresentação pode ser interrompida a qualquer momento.
De acordo com a seguinte fórmula
Pode obter
Ou seja, expanda um número N vezes e adicione o restante. Neste momento, o restante de $$ mod m $$ permanece inalterado

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 ;
}Dados pendentes: 1010 0111 0110 0
Gerar polinômio: 1010 1101 0 (
Coloque todos os dados pendentes nos data da fila
data = [1010011101100]
Gerar um polinômio de 9 bits, então primeiro deixe os 8 primeiros itens dos data da fila serem desquedados e coloque os dados na fila str
str = [10100111]
data = [01100]
data.Count = 5 ! = 0, continue a execução
Dequeue o primeiro item dos data da fila e coloque -os na fila str
str = [101001110]
data = [1100]
O primeiro elemento de str é 1
Insira 1 na coluna S
Execute bitwise exclusivo ou do valor da fila str e o valor do polinômio gerado e copie os últimos 8 caracteres do resultado para str 101001110 ^ 10101101010 = 000010100
S = [1]
str = [00010100]
data = [1100]
data.Count = 4 ! = 0, continue a execução
Dequeue o primeiro item dos data da fila e coloque -os na fila str
S = [1]
str = [000101001]
data = [100]
O primeiro elemento de str é 0
Insira 0 nas S e deixe o primeiro item de str dequeue
S = [10]
str = [00101001]
data = [100]
data.Count = 3 ! = 0, continue a execução
Dequeue o primeiro item dos data da fila e coloque -os na fila str
S = [10]
str = [001010011]
data = [00]
O primeiro elemento de str é 0
Insira 0 nas S e deixe o primeiro item de str dequeue
S = [100]
str = [01010011]
data = [00]
data.Count = 2 ! = 0, continue a execução
Dequeue o primeiro item dos data da fila e coloque -os na fila str
S = [100]
str = [010100110]
data = [0]
O primeiro elemento de str é 0
Insira 0 nas S e deixe o primeiro item de str dequeue
S = [1000]
str = [10100110]
data = [0]
data.Count = 1 ! = 0, continue a execução
Dequeue o primeiro item dos data da fila e coloque -os na fila str
S = [1000]
str = [101001100]
data = []
O primeiro elemento de str é 1
Insira 1 na coluna S
Execute bitwise exclusivo ou do valor da fila str e o valor do polinômio gerado e copie os últimos 8 caracteres do resultado para str 101001100 ^ 10101101010 = 000010110
S = [10001]
str = [00010110]
data = []
data.Count = 0 S = 10001 fila str = 00010110
Todo o processo de cálculo é:







