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