Newsgroup: it.comp.lang.visual-basic
Titolo: Forse OT... aiuto su Checksum.

Ciao ragazzi, scusate se il post è OT, ma non sapevo dove chiedere aiuto.
Sto realizzando un programmino in VB, che legge i valori, dalla porta
seriale.
I dati vengono sparati sotto il formato Intel Hexadecimal Format.
Ecco un esempio di record che ricevo (il carattere ":" contraddistingue
l'inizio di un nuovo record):
:1083D0005208B21484018025790DB4148401784BBD
:1083E0003410B6148401780B4F00F9C986FF770D5D
:1083F00008E15BF886870DAC29E05BF886411066E2
Secondo le specifiche nel manuale, la parte che contiene i dati è la
seguente (prendo per esempio il primo record):
:10
83D0
00
*****************
5208B21484018025
790DB4148401784B
*****************
BD
Le due stringhe tra asterischi, contengono i dati. Come si nota, ogni record
ha quindi due
stringhe che contengono dati.
Prendiamo la prima:
5208B21484018025
E' formata da 7 byte (come li chiama il manuale) che contengono i dati veri
e propri:
52 08 B2 14 84 01 80
Ogni coppia è una rappresentazione Esadecimale a due caratteri di un byte
binario.
Es. la coppia 52 in Hex è 01010010 in binario, cioè un byte.
Arrivo al punto.
L'ultima coppia, nel caso di cui sopra 25, è, come dice il manuale,
"Checksum of previous 7 bytes. Simple 8-bit sum of previous bytes"...
Che significa??? Non intendo la traduzione ;).
Cioè, per verificare che i 7 bytes precedenti siano corretti, come devo
fare???
Come si calcola "la semplice somma a 8-bit" dei 7 bytes precedenti?
Ovviamente anche 25 è in Hex.
Grazie a tutti.

> Guido:

Apri la calcolatrice di windows (calc.exe) poi:
    Visualizza
    > Scientifica
clic su:
    . Hex
    . DWord
Immetti: 52 + 08 Invio
Ottieni: 5A
Immetti: + B2 Invio
Ottieni: 10C
Sono due byte.
Adesso, invece, clic su:
    . Byte
e rifai il calcolo di prima.
Ottieni: 0C
1 byte. Ovvero la "semplice somma a 8-bit".
In vb:
Option Explicit
Sub Main()
  Dim s As String
  s = "5208B21484018025": Debug.Print s; ": "; CheckSumByte(s)
  s = "790DB4148401784B": Debug.Print s; ": "; CheckSumByte(s)
  s = "3410B6148401780B": Debug.Print s; ": "; CheckSumByte(s)
  s = "4F00F9C986FF770D": Debug.Print s; ": "; CheckSumByte(s)
  s = "08E15BF886870DAC": Debug.Print s; ": "; CheckSumByte(s)
  s = "29E05BF886411066": Debug.Print s; ": "; CheckSumByte(s)
End Sub
Private Function CheckSumByte( _
  ByVal Data As String _
) As Boolean
  Dim l As Integer
  Dim i As Integer
  Dim b As Byte
  l = Len(Data) - 2
  For i = 1 To l Step 2
    b = (CInt(b) + CByte("&H" & Mid$(Data, i, 2))) Mod &H100
  Next
  CheckSumByte _
    = (b = CByte("&H" & Mid$(Data, l + 1, 2)))
End Function
Immediate:
5208B21484018025: True
790DB4148401784B: True
3410B6148401780B: True
4F00F9C986FF770D: True
08E15BF886870DAC: False
29E05BF886411066: False
Come vedi le ultime due stringhe del tuo esempio hanno un checksum non
corretto: puo` darsi che tu abbia trascritto male (strano perche'
probabilmente hai fatto un copia&incolla) oppure che siano effettivamente
errati i dati di quel record, oppure... che io abbia perso una buona
occasione di far riposare la tastiera... :-(
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

Grazie ci cuore :))
Ora mi studio un pň la cosa :)
Grazie grazie (inchino inchino) :)))