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:
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:
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.