Jsem programátor a potřebuji odeslat data do stroje, ale musím na konci dat přidat kontrolní součet . Může mi někdo ukázat příklad, jak to udělat, abych mohl napsat program pro výpočet kontrolního součtu.

Pravidla: Bitová inverze 1 bajtového součtu bajtů začínající nejvýznamnějším bajtem adresy a končí bajtem před kontrolním součtem. (Chcete-li provést bitovou inverzi, „exkluzivní NEBO“ součet jednoho bajtu s FF hex.)

Díky

Komentáře

  • Co to má společného se značkou: power-electronics?

Odpověď

Definice docela dobře zakrývá to.

Bitová inverze 1 bajtového součtu bajtů počínaje nejvýznamnějším bajtem adresy a končícím bajtem před kontrolním součtem. (Chcete-li provést bitovou inverzi, „exclusive OR“ součet jednoho bajtu s FF hex.)

Příklad

  • Zpráva „Hello“ = Hex: 48 65 6C 6C 6F.
  • Když je přidám pomocí mého programu Windows Calc.exe v režimu programátoru, zobrazí se mi & h01F4.
  • Vezměte poslední bajt a ignorujte vše ostatní: & hF4.
  • & hF4 XOR & hFF = & h0B – váš kontrolní součet.

K objasnění posledního bitu:

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

Aktualizace

Z nějakého důvodu mi to nefunguje. Tady mám CA 00 01 70 00, přidám je, abych získal 13B, vezmu poslední bajt, který je 3B a XOR s FF, pak dostanu c4, který se liší od 8E (příklad, který jsem dostal z příručky). Chybí mi něco o pravidle?

Webové vyhledávání pravidla vyhodilo dokument z NESLAB . Na stránce B-2 čteme:

zde zadejte popis obrázku

Obrázek 1. Oblast kontrolního součtu je jedinou částí použitou v kontrolním součtu.

To by mělo vysvětlit vaši nejasnost. Hlavní znak není do výpočtu zahrnut. Nyní, když provedeme kontrolu na CA 00 01 70 00, můžeme CA vypustit a zbývá nám několik nul, 01 a 70, které jsou součtem & h71.

& h71 XOR & FF = & h8E. Voila!

Komentáře

  • Děkuji. Byl jsem zmatený ohledně " Bitové inverze 1 bajtového součtu bajtů ". Nevěděl jsem, že to znamená vzít poslední bajt, ale vy jste to vyčistili. Moc děkuji !!
  • Jen jsem zvědavý, proč XOR s h ' FF? Není to ' to stejné jako pouhé invertování každého bitu (0- > 1, 1- > 0). Vypadá to, že mi oba dělají totéž. Pak byste jej mohli reprezentovat jako " Bitově převrácený finální bajt součtu všech bajtů ve zprávě "
  • Ano, máte pravdu, ale XOR používá pouze jednu instrukci k převrácení všech 8 bitů. ' Nemohu myslet na efektivnější metodu. Můžeš?
  • Z nějakého důvodu to pro mě nefunguje. Tady mám CA 00 01 70 00, přidám je, abych získal 13B, vezmu poslední bajt, který je 3B a XOR s FF, pak dostanu c4, který se liší od 8E (příklad, který jsem dostal z příručky). Chybí mi něco o pravidle?
  • @transistor: Děkuji za objasnění. No, ' neznám programovací jazyk, jen mi to tak dává větší smysl. Vím, že v perlu je to ' jen ~ proměnná. Myslím, že to v praxi ' nerozlišuje

odpověď

Váš požadovaný kontrolní součet se počítá z údajů takto:

zde zadejte popis obrázku

Do kontrolního součtu nezahrnete hlavní znak 0xCA, pouze stínovaný bajtů.

Jednoduchý kousek kódu C pro výpočet vašeho příkladu:

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

A výsledek je podle očekávání:

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

Protože jsem deklaroval proměnnou cs jako nepodepsaný znak, vyhodí horní bity při každém přidání. Přidání je stejné jako u jiných příkladů, můžete horní bity na konci vyhodit, pokud to děláte ručně. V těchto případech buďte opravdu opatrní, co přesně je a co není zahrnuto do kontrolního součtu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *