Jestem programistą i muszę wysłać dane do maszyny, ale muszę dodać sumę kontrolną na końcu danych . Czy ktoś może mi pokazać przykład, jak to zrobić, abym mógł napisać program, który obliczy dla mnie sumę kontrolną.

Zasady: Odwrócenie bitowe sumy 1-bajtowej bajtów zaczynającej się od najbardziej znaczącego bajtu adresu i kończąc na bajcie poprzedzającym sumę kontrolną. (Aby wykonać inwersję bitową, „wyłącz OR” sumę jednego bajtu z szesnastkowym FF.)

Dzięki

Komentarze

  • Co to ma wspólnego z tagiem: energoelektronika?

Odpowiedź

Definicja całkiem dobra obejmuje to.

Bitowe odwrócenie 1-bajtowej sumy bajtów zaczynającej się od najbardziej znaczącego bajtu adresu i kończącej się bajtem poprzedzającym sumę kontrolną. (Aby wykonać odwrócenie bitowe, należy użyć „wyłącznego LUB” jednobajtowej sumy z FF hex.)

Przykład

  • Wiadomość „Hello” = Hex: 48 65 6C 6C 6F.
  • Dodając je za pomocą mojego Windows Calc.exe w trybie programisty otrzymuję & h01F4.
  • Weź ostatni bajt i zignoruj wszystko inne: & hF4.
  • & hF4 XOR & hFF = & h0B – Twoja suma kontrolna.

Aby wyjaśnić ostatni bit:

&hF4 = 1111 0100 &hFF = 1111 1111 --------- XOR = 0000 1011 = &h0B 

Aktualizacja

Z jakiegoś powodu to nie działa. Tutaj mam CA 00 01 70 00, dodaję je aby otrzymać 13B, biorę ostatni bajt czyli 3B i XOR z FF, potem otrzymuję c4, które jest inne niż 8E (przykład, który dostałem z instrukcji). Czy brakuje mi czegoś w regule?

Wyszukiwanie reguły w sieci spowodowało wyświetlenie dokumentu z NESLAB . Na stronie B-2 czytamy:

tutaj wprowadź opis obrazu

Rysunek 1. Region sumy kontrolnej jest jedyną częścią używaną w sumie kontrolnej.

To powinno wyjaśnić twoje zamieszanie. Główny bohater nie jest uwzględniany w obliczeniach. Teraz, jeśli sprawdzimy CA 00 01 70 00, możemy porzucić CA i zostanie nam kilka zer, 01 i 70, co daje sumę & h71.

& h71 XOR & FF = & h8E. Voila!

Komentarze

  • Dziękuję. Byłem zdezorientowany co do " bitowej inwersji 1-bajtowej sumy bajtów ". Nie wiedziałem, że oznacza to pobranie ostatniego bajtu, ale wyczyściłeś to. Dziękuję bardzo !!
  • Po prostu ciekawi, dlaczego XOR z h ' FF? Czy nie ' t to samo, co zwykłe odwracanie każdego bitu (0- > 1, 1- > 0). Wygląda na to, że obaj robią mi to samo. Następnie możesz przedstawić to jako " Odwrócony bitowo końcowy bajt sumy wszystkich bajtów w wiadomości "
  • Tak, masz rację, ale XOR używa tylko jednej instrukcji do przerzucenia wszystkich 8 bitów. Nie mogę ' wymyślić bardziej wydajnej metody. Potrafisz?
  • Z jakiegoś powodu to nie działa. Tutaj mam CA 00 01 70 00, dodaję je aby otrzymać 13B, biorę ostatni bajt czyli 3B i XOR z FF, potem otrzymuję c4, które jest inne niż 8E (przykład, który dostałem z instrukcji). Czy brakuje mi czegoś w regule?
  • @transistor: Dziękuję za wyjaśnienie. Cóż, nie ' nie znam języka programowania, po prostu ma to dla mnie większy sens. Wiem, że w perlu ' jest tylko ~ zmienną. Wydaje mi się, że w praktyce nie ' nie robi różnicy w żaden sposób

Odpowiedź

Wymagana suma kontrolna jest obliczana na podstawie danych w następujący sposób:

tutaj wprowadź opis obrazu

nie dodajesz znak wiodący 0xCA do sumy kontrolnej, tylko zacieniony bajtów.

Prosty fragment kodu w C do obliczenia przykładu:

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; } 

Wynik jest zgodny z oczekiwaniami:

sh-4.3$ gcc -o main *.c sh-4.3$ main cs = 8E 

Ponieważ zadeklarowałem zmienną cs jako znak bez znaku, po każdym dodaniu wyrzuca górne bity. Dodawanie przebiega tak samo, jak w innych przykładach, możesz wyrzucić górne bity na końcu, jeśli robisz to ręcznie. Po prostu bądź bardzo ostrożny w takich przypadkach, co dokładnie jest , a co nie jest zawarte w sumie kontrolnej.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *