Calcolo checksum 1 byte

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

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.

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 .

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
}

Scusa, ma Hex100 è = 256 non 64 ? giusto?

si scusa..modifico il post!!!

Perfetto,funziona Grazie ++++

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 (%).

La somma non é un modo buono di fare un checksum. Non si possono rivelare una inversione di 2 valori. Ciao Uwe

mancio:
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…

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

capisco. Molto ingegnosa quella scheda. :grin: :grin: :grin: Ciao Uwe