/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
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---



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste