Programozó vagyok és adatokat kell küldenem a gépre, de az adatok végén hozzá kell adnom az ellenőrző összeget . Mutatna valaki példát, hogyan kell csinálni, hogy aztán írhassak egy programot az ellenőrző összeg kiszámításához.

A szabályok: Az 1 bájtos bájtösszeg bitenkénti inverziója a legjelentősebb címbájttal kezdődik és az ellenőrző összeget megelőző bájttal végződik. (A bitenkénti inverzió végrehajtásához “exkluzív VAGY” az egy bájtos összeget FF hexával.)

Köszönöm

Megjegyzések

  • Mi köze ennek a címkéhez: power-electronics?

Válasz

A meghatározás elég jól lefedi.

Az 1 bájtos bájtösszeg bitenkénti inverziója a legjelentősebb címbájttól kezdődően és az ellenőrző összeget megelőző bájttal végződik. (A bitenkénti inverzió végrehajtásához “exkluzív VAGY” az egy bájtos összeget FF hexával.)

Példa

  • “Hello” = Hex: 48 65 6C 6C 6F üzenet.
  • Ezeket a Windows Calc.exe programmal programozó módban hozzáadva & h01F4.
  • Vegyük az utolsó bájtot, és hagyjunk figyelmen kívül minden mást: & hF4.
  • & hF4 XOR & hFF = & h0B – az ellenőrző összeg.

Az utolsó bit pontosításához:

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

Frissítés

Valamiért nem működik nálam. Itt van a CA 00 01 70 00, összeadom őket a 13B megszerzéséhez, az utolsó bájtot veszem, amely 3B és XOR az FF-mel, majd kapok c4-et, amely különbözik a 8E-től (példa a kézikönyvből). Hiányzik valami a szabályról?

A szabály internetes keresése felvetett egy dokumentumot a következőből: NESLAB . A B-2 oldalon a következőket olvashatjuk:

írja ide a kép leírását

1. ábra: Az ellenőrző összegben csak az ellenőrző összegű régiót használják.

Ez magyarázza a zavart. A fő karakter nem szerepel a számításban. Most, ha ellenőrzést hajtunk végre a CA 00 01 70 00-on, akkor eldobhatjuk a CA-t, és marad néhány nulla, 01 és 70, ami & h71 összegű.

& h71 XOR & FF = & h8E. Voila!

Kommentek

  • Köszönöm. Zavarban voltam a " bájtok 1 bájtos összegének bitenkénti inverziója miatt ". Nem tudtam, hogy azt jelenti, hogy az utolsó bájtot vesszük, de Ön kitisztította. Nagyon köszönöm !!
  • Csak kíváncsi, miért XOR h ' FF-mel? Nem ' ez ugyanaz, mint az egyes bitek invertálása (0- > 1, 1- > 0). Úgy tűnik, mindkettő ugyanazt csinálja velem. Ezután " formátumban ábrázolhatja az üzenet összes bájtjának összegét bitenként megfordítva "
  • Igen, igazad van, de az XOR csak egy utasítást használ mind a 8 bit átfordításához. Nem tudok ' gondolni egy hatékonyabb módszerre. Tudsz?
  • Valamiért ez nem működik nálam. Itt van a CA 00 01 70 00, összeadom őket a 13B megszerzéséhez, az utolsó bájtot veszem, amely 3B és XOR az FF-mel, majd kapok c4-et, amely különbözik a 8E-től (példa a kézikönyvből). Hiányzik valami a szabályról?
  • @transistor: Köszönöm a pontosítást. Nos, én nem ' nem ismerem a programozási nyelvet, nekem csak így van értelme. Tudom, hogy a perl ' csak ~ változó. Azt hiszem, a gyakorlatban ez ' nem változtat egyik vagy másik oldalon sem

válasz

A szükséges ellenőrző összeg az adatok alapján kerül kiszámításra:

írja ide a kép leírását

nem nem tartalmazza az ellenőrző összegben a 0xCA vezető karaktert, csak az árnyékolást bájtokat.

Egyszerű bit C kód a példa kiszámításához:

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

És az eredmény a vártnak felel meg:

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

Mivel a cs változót aláíratlan karakterként deklaráltam, minden összeadásnál eldobja a felső biteket. A hozzáadás ugyanúgy megegyezik a többi példával, hogy a felső biteket eldobhatja a végén, ha manuálisan csinálja. Csak nagyon vigyázzon ezekben az esetekben, hogy pontosan mi is szerepel a ben és mi nincs benne az ellenőrző összegben.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük