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