Go Down

Topic: Calcolo checksum 1 byte (Read 1 time) previous topic - next topic

Plexi47

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

mancio

prova

Code: [Select]


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.

Plexi47

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 .

mancio

#3
Jan 12, 2013, 03:10 pm Last Edit: Jan 12, 2013, 03:21 pm by mancio Reason: 1
io farei cosi allora

Code: [Select]


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
}


Plexi47

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

mancio

si scusa..modifico il post!!!

Plexi47

Perfetto,funziona
Grazie ++++

leo72

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

uwefed

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

qsecofr


io farei cosi allora

Code: [Select]


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

Plexi47


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

uwefed

capisco. Molto ingegnosa quella scheda. :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:
Ciao Uwe

Go Up