Sono un programmatore e ho bisogno di inviare dati alla macchina, ma devo aggiungere il checksum alla fine dei dati . Qualcuno può mostrarmi un esempio come farlo in modo che io possa scrivere un programma per calcolare il checksum per me.
Le regole: inversione bit per bit della somma di 1 byte di byte che inizia con il byte dellindirizzo più significativo e termina con il byte che precede il checksum. (Per eseguire uninversione bit per bit, “OR esclusivo” la somma di un byte con FF hex.)
Grazie
Commenti
- Cosa centra questo con il tag: power-electronics?
Answer
La definizione piuttosto bene lo copre.
Inversione bit per bit della somma di 1 byte di byte che inizia con il byte di indirizzo più significativo e termina con il byte che precede il checksum. (Per eseguire uninversione bit per bit, “OR esclusivo” la somma di un byte con FF hex.)
Esempio
- Message “Hello” = Hex: 48 65 6C 6C 6F.
- Aggiungendoli utilizzando il mio Windows Calc.exe in modalità Programmatore ottengo & h01F4.
- Prendi lultimo byte e ignora tutto il resto: & hF4.
- & hF4 XOR & hFF = & h0B – il tuo checksum.
Per chiarire lultima parte:
&hF4 = 1111 0100 &hFF = 1111 1111 --------- XOR = 0000 1011 = &h0B
Aggiorna
Per qualche motivo, non funziona per me. Qui ho CA 00 01 70 00, li sommo per ottenere 13B, prendo lultimo byte che è 3B e XOR con FF, poi ottengo c4, che è diverso da 8E (un esempio che ho preso dal manuale). Mi sono perso qualcosa della regola?
Una ricerca sul web per la regola ha generato un documento da NESLAB . A pagina B-2 leggiamo:
Figura 1. La regione del checksum è lunica parte utilizzata nel checksum.
Questo dovrebbe spiegare la tua confusione. Il personaggio principale non è incluso nel calcolo. Ora, se eseguiamo un controllo su CA 00 01 70 00, possiamo eliminare CA e restano alcuni zeri, 01 e 70 che si sommano a & h71.
& h71 XOR & FF = & h8E. Voilà!
Commenti
- Grazie. Ero confuso riguardo l " inversione bit per bit della somma di 1 byte di byte ". Non sapevo che significasse prendere lultimo byte, ma lhai cancellato. Grazie mille !!
- Sono solo curioso, perché XOR con h ' FF? ' non è come invertire ogni bit (0- > 1, 1- > 0). Sembra che entrambi facciano la stessa cosa con me. Quindi potresti rappresentarlo come " byte finale invertito bit per bit della somma di tutti i byte in un messaggio "
- Sì, hai ragione, ma XOR usa solo unistruzione per capovolgere tutti gli 8 bit. Non riesco ' a pensare a un metodo più efficiente. Puoi?
- Per qualche motivo, non funziona per me. Qui ho CA 00 01 70 00, li sommo per ottenere 13B, prendo lultimo byte che è 3B e XOR con FF, poi ottengo c4, che è diverso da 8E (un esempio che ho preso dal manuale). Mi manca qualcosa della regola?
- @transistor: Grazie per aver chiarito. Beh, non ' non conosco il linguaggio di programmazione, per me ha semplicemente più senso in questo modo. So che in perl ' è solo una ~ variabile. Immagino che in pratica non ' faccia la differenza
risposta
Il checksum richiesto viene calcolato sui dati in questo modo:
non includi il carattere principale 0xCA nel checksum, solo il carattere ombreggiato byte.
Un semplice bit di codice C per calcolare il tuo esempio:
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; }
E il risultato è come previsto:
sh-4.3$ gcc -o main *.c sh-4.3$ main cs = 8E
Poiché ho dichiarato la variabile cs come un carattere senza segno, elimina i bit superiori ad ogni aggiunta. Laggiunta è la stessa degli altri esempi, puoi buttare via i bit superiori alla fine se lo fai manualmente. Fai solo molta attenzione in questi casi a cosa è e cosa non è incluso nel checksum.