2 진 1의 보수 합계 연산

UDP 프로토콜의 체크섬 계산 .

  사실,이 계산 원리는 본질적으로 어렵지 않습니다. 이것은 이진법의 보수 합산 연산입니다. 특히 :

                                          0 + 0 = 0 ; 0 + 0 = 0

                                          1 + 0 = 0 + 1 = 1 ; 1 + 0 = 0 + 1 = 1

                                          1 + 1 = 10; 1 + 1 = 10

  그 중 10 분의 1이 다음 열에 더해지며, 가장 높은 열이 1 + 1이면 획득 한 10은 0으로 남고 1은 가장 낮은 열로 이동 한 다음 가장 낮은 비트로 이진 더하기를 수행합니다.

  Teacher Xie의 책에서 발신자에서 15 바이트 UDP 데이터를 확인한 다음 이진 수직 형식을 나열하고 결과를 제공하는 방법에 대해 이야기했지만 그 방법을 설명하지는 않습니다. 계획된. 지속적인 노력 끝에 마침내 전체 이진 계산 프로세스를 작성했습니다. 제가 수학 과학 아카데미에있을 때 선생님은 비교적 간단한 16 진수 계산 방법에 대해 이야기했습니다. 좋아, 먼저 사진을 찍자.

교과서에서시 선생님의 제목은 이렇습니다.

二进制版
1001 1001 0001 0011 //伪首部源IP地址前16位
0000 1000 0110 1000 //伪首部源IP地址后16位
1010 1011 0000 0011 //伪首部目的IP地址前16位
0000 1110 0000 1011 //伪首部目的IP地址后16位
0000 0000 0001 0001 //伪首部UDP协议字段代表号17,前面8位是填充0
0000 0000 0000 1111 //伪首部UDP长度字段
0000 0100 0011 1111 //UDP头部源IP地址对应的进程端口号
0000 0000 0000 1101 //UDP头部目的IP地址对应的进程端口号
0000 0000 0000 1111 //UDP头部UDP长度字段
0000 0000 0000 0000 //UDP头部UDP检验和
0101 0100 0100 0101 //数据字段
0101 0011 0101 0100 //数据字段
0100 1001 0100 1110 //数据字段
0100 0111 0000 0000 //数据字段+填充0字段
    
十六进制版
9913        //伪首部源IP地址前16位
0868        //伪首部源IP地址后16位
AB03        //伪首部目的IP地址前16位
0E0B        //伪首部目的IP地址后16位
0011        //伪首部UDP协议字段代表号17,前面8位是填充0
000F        //伪首部UDP长度字段
043F        //UDP头部源IP地址对应的进程端口号
000D        //UDP头部目的IP地址对应的进程端口号
000F        //UDP头部UDP长度字段
0000        //UDP头部UDP检验和
5445        //数据字段
5354        //数据字段
494E        //数据字段
4700        //数据字段+填充0字段

 바이너리 버전에서는 오른쪽 첫 번째 열에서 직접 수직 덧셈을 할 수 없으며 , 십진법의 수직 덧셈은 말할 것도없고 이진법의 수직 덧셈도 불가능합니다.

      올바른 접근 방식은 다음과 같습니다.
      (1) 첫 번째 행과 두 번째 행이 이진 보수 연산을 수행하도록합니다.
      위의 규칙에 따라 1 + 1 = 10이 발생하면 왼쪽 인접 열 아래에 작은 1을 쓰고 (이전 십진 캐리 덧셈과 유사), 캐리가없는 경우 측면 열에 이진 보수 연산을 수행하여 숫자를 얻습니다. , 지금 캐리로 이진 1의 보수 연산을 계속합니다. 캐리가있는 경우 먼저 인접한 높은 쪽 열 아래에 캐리의 작은 1을 쓰고 여기에 추가 할 1의 숫자를 가져옵니다. 1 + 1 = 10의 경우 만 있습니다. 0에 어떤 캐리가 더해져도 캐리가 없습니다. 첫 번째 계산에서 캐리가 없으면 1이 생성 될 때만 캐리가 발생합니다. 간단히 말해서 각 열에 대해, 단지이있을 것 한 번 많아야 캐리 , 그래서 캐리가 열을 건너 것이다하는 문제에 대해 걱정할 필요가 없습니다. 주의해야 할 점은 숫자를 잘못 쓰지 않는 것인데, 예를 들어이 논문을 쓰기 전에 초안을 두 번 입력했지만 여전히 실수를합니다.
      높은 자리에 1이있는 경우 1을 가장 낮은 자리로 옮기고 이진 1의 보수 계산을 다시 수행하십시오. 이것은 본질적으로 보수입니다.
      (2) 첫 번째와 두 번째 줄과 세 번째 줄의 결과에 대한 이진 보수를 계산합니다.
      (3) 연산 결과가 역전되고 체크섬이 획득됩니다.

      16 진수 버전에서는 계산량이 크게 줄어들며 주요 계산 단계는 다음과 같습니다.
      (1) 오른쪽 첫 번째 열부터 시작하여 첫 번째 열의 값을 10 진수로 계산합니다.
      여기서 첫 번째 열은 107로 계산되며 8 비트 바이너리로 쓰여진 것은 01101011입니다.
      (2) 계산 된 결과에 따라 두 부분으로 나눈 다음 왼쪽 4 자리는 다음 열에 추가 된 숫자로 10 진수로 변환되고, 오른쪽 4 자리는 첫 번째 열의 결과로 16 진수로 변환됩니다.
      여기에 610B16이 있는데, 그림은 D로 잘못 계산되고, 6은 다음 열 연산에서 추가 될 개체이고, B는 첫 번째 열의 결과입니다.
      (3) 두 번째 열의 결과를 십진수로 계산하고, 첫 번째 열에서 캐리를 더하여 두 번째 열에 십진수를 얻고, 이진수로 변환하고, 두 번째 단계에 따라 판단합니다.
      여기서 두 번째 열은 24이고 6은 30이며 8 비트 이진 형식의 00011110은 1E입니다. 두 번째 열의 결과는 1이고 세 번째 열의 십진수는 1입니다. 그런 다음 세 번째 열의 결과가 6이고 소수 캐리가 4라고 계산할 수 있습니다.
      (4) 최상위 비트에서 최종 10 진수 결과를 계산하여 이진수로 변환 한 후 오른쪽 4 비트를 최종 결과로 사용하고 왼쪽 4 비트를 다음 열로 이동합니다. 이전 단계 96EB에서 얻은 결과를 사용하여 0010을 더하여 최종 결과를 얻습니다. 마지막 단계는 잘못되었으므로 버려서는 안됩니다.
      최종 결과는 96ED입니다.
      (5) 결과를 반전시켜 체크 코드를 얻습니다.
      체크 코드는 6912입니다.

      좋아, 이번에는이 특정 문제에 대한 해결책을 처음 제안했는데 시간이 있으면 컴퓨터의 원래 코드, 역 코드 및 보완에 대한 지식을 분류해야합니다.

추천

출처blog.csdn.net/qq_36171263/article/details/100335730