Dátový typ UInt16 som použil preto, lebo som prepisoval funkciu pre CheckSum priamo od výrobcu zariadenia. Prepisoval som ju zo starého Cčka.
Private Function CalcCrc(ByVal crcSum As System.UInt16, ByVal dataChar As Byte) As System.UInt16
Dim myCrcSum As Integer = Integer.Parse(crcSum.ToString)
myCrcsum = myCrcsum Xor dataChar * 256
For i As Integer = 0 To 7
If myCrcSum > &H7FFF Then
myCrcSum = (myCrcSum * 2) Xor &H8005
Else
myCrcSum *= 2
End If
Next
If myCrcSum < 2 ^ 16 Then
Return System.UInt16.Parse(crcSum.ToString)
Else
Throw New OverflowException("crcSum je príliš velké aby mohlo byt skonvertované na UInt16")
End If
End Function
Všetko vypadá, že funguje správne ibaže, keď príde do datachar číslo 1 a v cykle i nadobudne hodnotu 7 vtedy myCrcSum je väčšie ako 32767(&H7FFF) a výsledkom riadku myCrcSum = (myCrcSum * 2) Xor &H8005 je potom 98309 čo je väčšie ako 2 na 16 a teda sa to nedá na UInt16 previesť. Ja to dávam za chybu tomu, že sa xor počíta medzi integermi a nie medzi uint16. Toto je starší kód od výrobcu zariadenia pre Checksum unsigned int calcCrc(unsigned int crcSum, unsigned char datachar) { unsigned char count; crcSum = crcSum ^ (datachar * 256); for (count = 0;count <=7;count++) { if (crcSum > 0x7FFF) crcSum = (crcSum * 2) ^ 0x8005; else crcSum = crcSum * 2; } return crcSum; } Dátové typy od výrobcu : char - 1 byte unsigned integer, value 0-255 unsigned int - 2 byte unsigned integer, value 0 - 65.535 Problém je, že VB .NET 2003 nedokáže urobiť štandardne XOR medzi dátovými typmi UINT16
|