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, 끝, 나머지는 str = 00010110 , 몫은 S = 10001 입니다.
전체 계산 프로세스는 다음과 같습니다.







