Ik ben een programmeur en ik moet gegevens naar de machine sturen, maar ik moet een checksum toevoegen aan het einde van de gegevens . Kan iemand me een voorbeeld laten zien hoe ik het moet doen, zodat ik dan een programma kan schrijven om de checksum voor mij te berekenen.

De regels: Bitgewijze inversie van de 1 byte som van bytes beginnend met de meest significante adresbyte en eindigend met de byte voorafgaand aan de checksum. (Om een bitsgewijze inversie uit te voeren, “exclusieve OR” de som van één byte met FF hex.)

Bedankt

Reacties

  • Wat heeft dit te maken met de tag: power-electronics?

Answer

De definitie is redelijk goed bedekt het.

Bitsgewijze inversie van de 1 byte som van bytes beginnend met de meest significante adresbyte en eindigend met de byte voorafgaand aan de checksum. (Om een bitsgewijze inversie uit te voeren, “exclusief OR” de som van één byte met FF hex.)

Voorbeeld

  • Bericht “Hallo” = Hex: 48 65 6C 6C 6F.
  • Als ik deze optel met mijn Windows Calc.exe in de programmeermodus, krijg ik & h01F4.
  • Neem de laatste byte en negeer al het andere: & hF4.
  • & hF4 XOR & hFF = & h0B – uw checksum.

Om het laatste stukje te verduidelijken:

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

Update

Om de een of andere reden werkt het niet voor mij. Hier heb ik CA 00 01 70 00, ik tel ze op om 13B te krijgen, ik neem de laatste byte die 3B is en XOR met FF, dan krijg ik c4, wat anders is dan 8E (een voorbeeld heb ik uit de handleiding). Mis ik iets over de regel?

Een zoekopdracht op internet naar de regel leverde een document op van NESLAB . Op pagina B-2 lezen we:

voer de afbeeldingsbeschrijving hier in

Figuur 1. De checksum regio is het enige deel dat gebruikt wordt in de checksum.

Dit zou je verwarring moeten verklaren. Het hoofdpersonage wordt niet meegenomen in de berekening. Als we nu een controle uitvoeren op CA 00 01 70 00, kunnen we CA laten vallen en blijven er een paar nullen, 01 en 70 over, wat neerkomt op & h71.

& h71 XOR & FF = & h8E. Voila!

Reacties

  • Bedankt. Ik was in de war over " Bitsgewijze inversie van de som van 1 bytes van bytes ". Ik wist niet dat het betekent om de laatste byte te nemen, maar je hebt het gewist. Heel erg bedankt !!
  • Gewoon nieuwsgierig, waarom XOR met h ' FF? Isn ' t dit hetzelfde als het omkeren van elke bit (0- > 1, 1- > 0). Het lijkt erop dat beide hetzelfde bij mij doen. Dan zou je het kunnen voorstellen als " Bitsgewijs omgekeerde laatste byte van de som van alle bytes in een bericht "
  • Ja, je hebt gelijk, maar XOR gebruikt slechts één instructie om alle 8 bits om te draaien. Ik kan ' geen efficiëntere methode bedenken. Kunt u?
  • Om de een of andere reden werkt het niet voor mij. Hier heb ik CA 00 01 70 00, ik tel ze op om 13B te krijgen, ik neem de laatste byte die 3B is en XOR met FF, dan krijg ik c4, wat anders is dan 8E (een voorbeeld heb ik uit de handleiding). Mis ik iets van de regel?
  • @transistor: Bedankt voor de verduidelijking. Nou, ik ken de programmeertaal niet ', het is gewoon logischer voor mij. Ik weet in perl dat het ' slechts ~ variabele is. Ik denk dat het in de praktijk niet ' in beide gevallen een verschil maakt

Antwoord

Uw vereiste checksum wordt als volgt berekend op basis van gegevens:

voer hier een afbeeldingsbeschrijving in

U hoeft niet het hoofdteken 0xCA op te nemen in de checksum, alleen het gearceerde bytes.

Een eenvoudig stukje C-code om uw voorbeeld te berekenen:

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

En het resultaat is zoals verwacht:

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

Aangezien ik de variabele cs heb gedeclareerd als een unsigned char, worden de bovenste bits bij elke toevoeging weggegooid. Toevoegen is net hetzelfde als andere voorbeelden, je kunt de bovenste stukjes aan het einde weggooien als je het handmatig doet. Wees in deze gevallen gewoon heel voorzichtig wat is en wat niet is opgenomen in de checksum.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *