저는 프로그래머이고 데이터를 컴퓨터로 보내야하지만 데이터 끝에 체크섬을 추가해야합니다. . 누군가 저에게 체크섬을 계산하는 프로그램을 작성할 수있는 방법을 보여줄 수 있습니까?
규칙 : 최상위 주소 바이트로 시작하는 1 바이트 바이트 합계의 비트 반전 체크섬 앞의 바이트로 끝납니다. (비트 반전을 수행하려면 FF 16 진수로 1 바이트 합계를 “배타적 OR”로 지정합니다.)
감사합니다
댓글
- 이것이 power-electronics 태그와 어떤 관련이 있습니까?
답변
정의가 꽤 좋습니다.
최상위 주소 바이트에서 시작하여 체크섬 앞의 바이트로 끝나는 1 바이트 바이트 합계의 비트 단위 반전. (비트 반전을 수행하려면 FF 16 진수로 1 바이트 합계를 “배타적 OR”로 지정합니다.)
예
- 메시지 “Hello”= Hex : 48 65 6C 6C 6F.
- 프로그래머 모드에서 Windows Calc.exe를 사용하여 추가하면 & h01F4가 표시됩니다.
- li>
- 마지막 바이트를 취하고 나머지는 모두 무시 : & hF4.
- & hF4 XOR & hFF = & h0B-체크섬
마지막 비트를 명확히하려면 :
&hF4 = 1111 0100 &hFF = 1111 1111 --------- XOR = 0000 1011 = &h0B
업데이트
어떤 이유로 저에게 작동하지 않습니다. 여기에 CA 00 01 70 00이 있고, 13B를 얻기 위해 더하고, 마지막 바이트 인 3B와 FF를 가진 XOR을 취한 다음, 8E와 다른 c4를 얻습니다 (설명서에서 얻은 예). 규칙에 대해 놓친 것이 있습니까?
규칙에 대한 웹 검색이 에서 문서를 표시했습니다. NESLAB . B-2 페이지에는 다음과 같은 내용이 있습니다.
그림 1. 체크섬 영역은 체크섬에서 사용되는 유일한 부분입니다.
이것은 혼란을 설명합니다. 리드 문자는 계산에 포함되지 않습니다. 이제 CA 00 01 70 00에 대해 검사를 실행하면 CA를 삭제할 수 있고 0이 몇 개 남습니다. 01과 70은 합계가 & h71입니다.
& h71 XOR & FF = & h8E. 짜잔!
댓글
- 감사합니다. " 1 바이트 바이트 합계 "의 비트 반전에 대해 혼란 스러웠습니다. 나는 그것이 마지막 바이트를 가져가는 것을 의미하는지 몰랐지만 당신은 그것을 지 웠습니다. 정말 감사합니다 !!
- 궁금한 점이 있습니다. 왜 XOR이 h ' FF입니까? ' 각 비트를 반전하는 것과 동일하지 않습니다 (0- > 1, 1- > 0). 둘 다 나에게 같은 일을하는 것 같습니다. 그런 다음 " 메시지의 모든 바이트 합계의 비트 단위 반전 최종 바이트로 나타낼 수 있습니다. "
- 예, 맞지만 XOR은 하나의 명령어 만 사용하여 8 비트를 모두 뒤집습니다. 더 효율적인 방법은 ' 생각할 수 없습니다. 할 수 있습니까?
- 어떤 이유로 저에게는 작동하지 않습니다. 여기에 CA 00 01 70 00이 있고, 13B를 얻기 위해 더하고, 마지막 바이트 인 3B와 FF를 가진 XOR을 취한 다음, 8E와 다른 c4를 얻습니다 (설명서에서 얻은 예). 규칙에 대해 놓친 점이 있습니까?
- @transistor : 명확히 해주셔서 감사합니다. 글쎄요, 저는 ' 프로그래밍 언어를 몰라요. 그게 더 이해가갑니다. 저는 Perl에서 ' 단지 ~ 변수라는 것을 알고 있습니다. 실제로는 ' 어느 쪽이든 차이를 만들지 않습니다
답변
필요한 체크섬은 데이터에서 다음과 같이 계산됩니다.
당신은 체크섬에 선행 문자 0xCA를 포함하지 바이트.
예를 계산하기위한 간단한 C 코드 :
int main() { int i; unsigned char cs; unsigned char a[] = {0x00, 0x01, 0x70, 0x00}; cs=0; for (i=0; i< sizeof(a); i++) { cs += a[i]; } cs ^=0xFF; printf("cs = %X \n", cs); return 0; }
결과는 예상대로입니다.
sh-4.3$ gcc -o main *.c sh-4.3$ main cs = 8E
cs 변수를 부호없는 문자로 선언 했으므로 추가 할 때마다 상위 비트를 버립니다. 추가는 다른 예제와 동일하며 수동으로 수행하는 경우 끝에 상위 비트를 버릴 수 있습니다. 이 경우 체크섬에 포함되지 있고 무엇이 포함되지 않는지 정확히주의해야합니다.