|  | 		    
					
        
         
          
         
	
          | |  | CRC 16 Checksums beregning Fra : Søren
 | 
 Dato :  06-03-02 19:15
 | 
 |  | Jeg har nedenstående pseudo kode til udregning af en CRC16 checksum. Jeg
 skal have lavet en komponent i Visual Basic, som benytter sig af
 nedenstående. Er der herinde som kan finde ud af at få det oversat til noget
 brugbart VB kode ?
 
 Og det giver mig slet ikke noget indtryk af hvad det går ud på. Håber nogen
 forstår det.
 
 Mvh.
 Søren
 
 
 CRC-16 calculation:
 
 The CRC16 calculation is done from id no to the ETX, excl. the ETX.
 
 This routine generates a CRC-16 forward remainder of ASCII
 
 characters of 7 bit contained in 8 bit register.
 
 CRCR is a 16 bit register which contains the result dynamically.
 
 CRCP is a 16 bit register which contains the polynomium for the
 
 standard X^16 + X^15 + X^2 + 1 = 1 1000 0000 0000 0101 binary.
 
 The first bit is implicitly given in the carry, CRCP = 8005 hex.
 
 CRCRhig = MSB CRCPhig = MSB = 80 hex
 
 CRCRlow = LSB CRCPlow = LSB = 05 hex
 
 
 Pseudo code for calculation:
 
 Character string
 
 start: SET CRCR = 0
 
 >>>> Char. start: SET COUNTER = 7
 
 SET TEMP = CHARACTER * 2
 
 SET CRCRhig = CRCRhig <XOR> TEMP
 
 >>> shift crcr: SET CRCR = CRCR * 2
 
 IF no carry JUMP count shift >>
 
 SET CRCR = CRCR <xor> CRCP
 
 >> Count shift: SET COUNTER = COUNTER - 1
 
 IF counter not zero JUMP shift crcr >>>
 
 SET CHARACTER = next character
 
 IF no end of string JUMP char. start >>>>
 
 
 
 
 
 |  |  | 
  Rayman (09-03-2002) 
 
	
          | |  | Kommentar Fra : Rayman
 | 
 Dato :  09-03-02 11:17
 | 
 |  | Ok, det er noget som du bør lave i C, eller helst assembler, da disse
 funktioner er MEGET hurtige der, men MEGET langsomme i VB. Men jeg prøver
 alligevel:
 
 
 Først teksten:
 CRC 16 beregning
 CRC16 bliver lavet ud fra et id til en checksum, eksklusiv checksummen
 Routinen laver en CRC-16 fremadrettet checksum
 Tegn fra bit 7 er indeholdt i et 8 bit register (her: Variabel, ellers CPU
 register)
 CRCR er et 16 bit register (her: long, da vb ikke kan bruge unsigned), som
 indeholder resultatet
 CRCP er et 16 bit register der indehold ID'et
 Udskrivet som binær er indholdet = 1000 0000 0000 0101
 CRCRHig = MostSignificantByte CRCPhig = 80 hex (den øverste byte)
 CRCRlow = LeastSignificantByte CRCPLow = 05 hex
 
 Så koden:
 Public Function Calculate_crc16(StrMessage As String) As Long
 Dim bTemp As Byte
 Dim crcrhig As Byte
 Dim lStrPos As Long
 Dim Character As Byte
 Dim iCarry As Integer
 Dim lResult As Long
 Dim lResultHigh As Long
 Dim lPolonium As Long
 Dim lCounter As Long 'For Speed reasons, could be byte but that is slow
 
 Const CRCID = 32773 '&H8005
 
 lPolonium = CRCID
 lResult = 0
 
 For lStrPos = 1 To Len(StrMessage)
 Character = Asc(Mid(StrMessage, lStrPos, 1))
 
 bTemp = (Character And &H7F) * 2
 lResultHigh = lResult / 2 ^ 8
 lResultHigh = lResultHigh Xor bTemp
 lResult = (lResult And &HFF) Or (lResultHigh * 2 ^ 8)
 For lCounter = 0 To 7
 iCarry = (lResult And &H8000) / 2 ^ 15
 lResult = (lResult And &H7FFF) * 2
 If iCarry <> 0 Then
 lResult = lResult Xor lPolonium
 End If
 Next lCounter
 Next lStrPos
 Calculate_crc16 = lResult
 
 End Function
 
 Jeg ved ikke om den matcher 100% din beskrivelse, men der er ikke meget at
 gå efter. Har du ikke nogle resultater fra en stump kode der virker?
 (Tekststreng, resultat). Du skal nok ikke bruge koden på en hel fil, da VB
 ikke kan lave shifts, og alt derfor må laves med gange og divider.
 
 Held og lykke. Du må gerne skrive tilbage, hvis du eller andre får den til
 virke som den skal.
 
 Mvh. Rayman
 
 
 "Søren" <soren@FJERN_DETTEelisiussen.dk> wrote in message
 news:3c865c92$0$16408$edfadb0f@dspool01.news.tele.dk...
 > Jeg har nedenstående pseudo kode til udregning af en CRC16 checksum. Jeg
 > skal have lavet en komponent i Visual Basic, som benytter sig af
 > nedenstående. Er der herinde som kan finde ud af at få det oversat til
 noget
 > brugbart VB kode ?
 >
 > Og det giver mig slet ikke noget indtryk af hvad det går ud på. Håber
 nogen
 > forstår det.
 >
 > Mvh.
 > Søren
 >
 >
 > CRC-16 calculation:
 > The CRC16 calculation is done from id no to the ETX, excl. the ETX.
 > This routine generates a CRC-16 forward remainder of ASCII
 > characters of 7 bit contained in 8 bit register.
 > CRCR is a 16 bit register which contains the result dynamically.
 > CRCP is a 16 bit register which contains the polynomium for the
 > standard X^16 + X^15 + X^2 + 1 = 1 1000 0000 0000 0101 binary.
 > The first bit is implicitly given in the carry, CRCP = 8005 hex.
 > CRCRhig = MSB CRCPhig = MSB = 80 hex
 > CRCRlow = LSB CRCPlow = LSB = 05 hex
 > Pseudo code for calculation:
 > Character string
 > start: SET CRCR = 0
 > >>>> Char. start: SET COUNTER = 7
 >
 > SET TEMP = CHARACTER * 2
 >
 > SET CRCRhig = CRCRhig <XOR> TEMP
 >
 > >>> shift crcr: SET CRCR = CRCR * 2
 >
 > IF no carry JUMP count shift >>
 >
 > SET CRCR = CRCR <xor> CRCP
 >
 > >> Count shift: SET COUNTER = COUNTER - 1
 >
 > IF counter not zero JUMP shift crcr >>>
 >
 > SET CHARACTER = next character
 >
 > IF no end of string JUMP char. start >>>>
 >
 >
 >
 
 
 
 
 |  |  | 
  Søren (09-03-2002) 
 
	
          | |  | Kommentar Fra : Søren
 | 
 Dato :  09-03-02 13:24
 | 
 |  | Hej Rayman.
 
 Jeg takker for det meget gode bud. Jeg prøver lige at bore lidt ned i koden
 og se om jeg kan få det til at virke, og så vender jeg selvfølgelig tilbage.
 Jeg har mulighed for at teste det og jeg kan også skaffe reelle strenge man
 kan sammenligne med, men det skal blive meget spændende at få afprøvet. Jeg
 takker for indsatsen.
 
 Mvh.
 Søren
 "Rayman" <rayman_dk@email.com> wrote in message
 news:Kili8.2$8A5.182@news000.worldonline.dk...
 > Ok, det er noget som du bør lave i C, eller helst assembler, da disse
 > funktioner er MEGET hurtige der, men MEGET langsomme i VB. Men jeg prøver
 > alligevel:
 >
 >
 > Først teksten:
 > CRC 16 beregning
 > CRC16 bliver lavet ud fra et id til en checksum, eksklusiv checksummen
 > Routinen laver en CRC-16 fremadrettet checksum
 > Tegn fra bit 7 er indeholdt i et 8 bit register (her: Variabel, ellers CPU
 > register)
 > CRCR er et 16 bit register (her: long, da vb ikke kan bruge unsigned), som
 > indeholder resultatet
 > CRCP er et 16 bit register der indehold ID'et
 > Udskrivet som binær er indholdet = 1000 0000 0000 0101
 > CRCRHig = MostSignificantByte CRCPhig = 80 hex (den øverste byte)
 > CRCRlow = LeastSignificantByte CRCPLow = 05 hex
 >
 > Så koden:
 > Public Function Calculate_crc16(StrMessage As String) As Long
 > Dim bTemp As Byte
 > Dim crcrhig As Byte
 > Dim lStrPos As Long
 > Dim Character As Byte
 > Dim iCarry As Integer
 > Dim lResult As Long
 > Dim lResultHigh As Long
 > Dim lPolonium As Long
 > Dim lCounter As Long 'For Speed reasons, could be byte but that is slow
 >
 > Const CRCID = 32773 '&H8005
 >
 > lPolonium = CRCID
 > lResult = 0
 >
 > For lStrPos = 1 To Len(StrMessage)
 >     Character = Asc(Mid(StrMessage, lStrPos, 1))
 >
 >     bTemp = (Character And &H7F) * 2
 >     lResultHigh = lResult / 2 ^ 8
 >     lResultHigh = lResultHigh Xor bTemp
 >     lResult = (lResult And &HFF) Or (lResultHigh * 2 ^ 8)
 >     For lCounter = 0 To 7
 >         iCarry = (lResult And &H8000) / 2 ^ 15
 >         lResult = (lResult And &H7FFF) * 2
 >         If iCarry <> 0 Then
 >             lResult = lResult Xor lPolonium
 >         End If
 >     Next lCounter
 > Next lStrPos
 > Calculate_crc16 = lResult
 >
 > End Function
 >
 > Jeg ved ikke om den matcher 100% din beskrivelse, men der er ikke meget at
 > gå efter. Har du ikke nogle resultater fra en stump kode der virker?
 > (Tekststreng, resultat). Du skal nok ikke bruge koden på en hel fil, da VB
 > ikke kan lave shifts, og alt derfor må laves med gange og divider.
 >
 > Held og lykke. Du må gerne skrive tilbage, hvis du eller andre får den til
 > virke som den skal.
 >
 > Mvh. Rayman
 >
 ---SNIP---
 
 
 
 
 |  |  | 
 |  |