Offline
Newbie
Karma: 0
Posts: 5
|
 |
« on: January 12, 2013, 08:49:51 am » |
Salve, premetto di essere un absolute newbee in C, provengo da basic a vb.net, vorrei inserire in una funzione il calcolo del checksum ad 1 byte Mod H100, in VBnet la funzione è questa:
Public Function CheckSum(ByVal ByteList As List(Of Byte)) As Byte
Dim total As Integer = 0 For Each b As Byte In ByteList total = (total + b) Mod &H100 Next Return total
End Function
quale è la "traduzione" in C ? google non mi ha dato risposta
Grazie Mauro
|
|
|
|
|
Logged
|
|
|
|
|
Fidenza (PR)
Offline
Full Member
Karma: 3
Posts: 136
Arduino rocks
|
 |
« Reply #1 on: January 12, 2013, 09:00:37 am » |
prova byte CheckSum(byte arr[], int dim_array){ int total = 0; for(int i=0; i<dim_array; i++) total = (total + arr[i]) % 100;
return total }
ma dipende appunto cosa vuole fare la tua funzione.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #2 on: January 12, 2013, 09:05:51 am » |
Intanto grazie per la risposta, la funzione deve fare la somma BYTE PER BYTE dell'array di byte, se nei vari passaggi il risultato è > Hex100 prende come valore l'eccedenza e prosegue .
|
|
|
|
|
Logged
|
|
|
|
|
Fidenza (PR)
Offline
Full Member
Karma: 3
Posts: 136
Arduino rocks
|
 |
« Reply #3 on: January 12, 2013, 09:10:19 am » |
io farei cosi allora byte CheckSum(byte arr[], int dim_array){ byte total = 0; for(int i=0; i<dim_array; i++) total = (total + arr[i]);
if(total>256) //100h = 256; total = total % 256;
return total }
|
|
|
|
« Last Edit: January 12, 2013, 09:21:04 am by mancio »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #4 on: January 12, 2013, 09:18:05 am » |
Scusa, ma Hex100 è = 256 non 64 ? giusto?
|
|
|
|
|
Logged
|
|
|
|
|
Fidenza (PR)
Offline
Full Member
Karma: 3
Posts: 136
Arduino rocks
|
 |
« Reply #5 on: January 12, 2013, 09:20:41 am » |
si scusa..modifico il post!!!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #6 on: January 12, 2013, 09:46:43 am » |
Perfetto,funziona Grazie ++++
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 226
Posts: 16993
Don't know what I do
|
 |
« Reply #7 on: January 12, 2013, 10:45:15 am » |
Fare un test per controllare se un tipo byte sia maggiore di 256 è inutile perché un tipo byte può contenere solo un numero da 0 a 255. Se si somma ad una variabile un valore maggiore di quello che può contenere, essa va in overflow, per cui se si fa ad esempio 250+10 il risultato sarà 4 e non 260, si potrebbe evitare quell'operazione modulo (%).
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16131
+39 349 2158303
|
 |
« Reply #8 on: January 12, 2013, 02:56:24 pm » |
La somma non é un modo buono di fare un checksum. Non si possono rivelare una inversione di 2 valori. Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 7
Posts: 293
|
 |
« Reply #9 on: January 12, 2013, 03:53:59 pm » |
io farei cosi allora byte CheckSum(byte arr[], int dim_array){ byte total = 0; for(int i=0; i<dim_array; i++) total = (total + arr[i]);
if(total>256) //100h = 256; total = total % 256;
return total }
il total è rimasto dichiarato byte... non supera mai il 256... sommando fa overflow...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #10 on: January 12, 2013, 04:21:26 pm » |
La somma non é un modo buono di fare un checksum. Non si possono rivelare una inversione di 2 valori. Ciao Uwe
Grazie a tutti , Uwe, perfettamente d'accordo, ma devo comunicare con una scheda che utilizza questo metodo. Mauro
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Offline
Brattain Member
Karma: 172
Posts: 16131
+39 349 2158303
|
 |
« Reply #11 on: January 12, 2013, 05:08:39 pm » |
capisco. Molto ingegnosa quella scheda.  Ciao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
|