Toon posts:

[vb6]replace functie voor hex getallen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een applicatie die volgens een bepaald protocol data verstuurd. de datastring bestaat uit 28 hex getallen, echter bepaalde combinaties mogen er niet in voorkomen en moeten vervangen worden door een ander paar (FD door FD00, FE door FD01 en FF door FD02). Ik ben al een tijdje aan het klooien maar er blijven fouten in zitten. In mijn huidige code neemt hij steeds de laatste bytes niet mee.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Dim HuidigeByte As String
Dim AantalHexcodes As Integer
Dim TijdelijkeByteString As String

Public Function BiteStuffing(ByRef ByteString As String) As String
'ByteString is een hex string van 28 tekens (14 paren van 2 hex getallen)

TijdelijkeByteString = ByteString

If Len(TijdelijkeByteString) = 28 Then

    AantalHexcodes = 27
    
    For I% = 1 To AantalHexcodes Step 2
    
    HuidigeByte = Mid(TijdelijkeByteString, I, 2)
    EindRest = Mid(TijdelijkeByteString, (I + 2), AantalHexcodes - I)
    BeginRest = Left(TijdelijkeByteString, (I - 1))

    Select Case HuidigeByte
        Case "FD"
        HuidigeByte = "FD00"
        AantalHexcodes = AantalHexcodes + 2
        I% = I% + 2
    Case "FE"
        HuidigeByte = "FD01"
        AantalHexcodes = AantalHexcodes + 2
        I% = I% + 2
    Case "FF"
        HuidigeByte = "FD02"
        AantalHexcodes = AantalHexcodes + 2
        I% = I% + 2
    End Select

    TijdelijkeByteString = BeginRest & HuidigeByte & EindRest

    Next I%

    BiteStuffing = TijdelijkeByteString
Else
    MsgBox ("Er is een fout opgetreden bij het samenstellen van de data."), , "Let Op!"
End If
End Function

ziet iemand wat er misgaat?

Verwijderd

Topicstarter
Als je bijvoorbeeld deze string invoert neemt hij de laatste (FF) waarden niet mee:
00FF00FE00FD000000000000FF00

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Visual Basic:
1
2
3
4
MyString = "00FF00FE00FD000000000000FF00"
MyString = Replace(MyString,"FD","FD00")
MyString = Replace(MyString,"FE","FD01")
MyString = Replace(MyString,"FF","FD02")

:?

Deze is misschien een tikje rigoreus...Moet je string 28 tekens lang blijven? Want zoals je het nu uit legt wordt je string langer...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Function ByteStuffing(ByVal ByteString As String) As String
    Dim T As Long
    Dim sTMP As String
    Dim sOut As String
    
    sOut = ""
    For T = 1 To Len(ByteString) Step 2
        sTMP = Replace(Mid(ByteString, T, 2), "FD", "FD00")
        sTMP = Replace(sTMP, "FE", "FD01")
        sTMP = Replace(sTMP, "FF", "FD02")
        sOut = sOut & sTMP
    Next
    ByteStuffing = sOut
End Function

Zoiets misschien?

Enniewee, dit is redelijk basic, en we zijn hier niet om je code te debuggen. Stap er eens door heen met een breakpoint ofzo?

[ Voor 205% gewijzigd door RobIII op 31-08-2004 09:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
:) Je hebt gelijk.
Ik had zoiets ook al geprobeerd maar dat werkte niet omdat hij alle FD00 weer opnieuw ging vervangen door FD00.
Ik snap nu wel waar de fout zat...ik had de volgorde natuurlijke moeten aanpassen...zucht...
thnxs!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op 31 augustus 2004 @ 09:59:
:) Je hebt gelijk.
Ik had zoiets ook al geprobeerd maar dat werkte niet omdat hij alle FD00 weer opnieuw ging vervangen door FD00.
Ik snap nu wel waar de fout zat...ik had de volgorde natuurlijke moeten aanpassen...zucht...
thnxs!
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Function ByteStuffing(ByVal ByteString As String) As String
    Dim T As Long
    Dim sTMP As String
    Dim sOut As String
    
    sOut = ""
    T = 1
    While T <= Len(ByteString)
        sTMP = Ucase(Mid(ByteString, T, 2))
        Select Case sTMP
            Case "FD", "FE", "FF":
                If Mid(ByteString, T + 2, 2) = "00" Then
                    sTMP = Replace(sTMP, "FD", "FD00")
                    sTMP = Replace(sTMP, "FE", "FD01")
                    sTMP = Replace(sTMP, "FF", "FD02")
                    T = T + 2
                End If
        End Select
        sOut = sOut & sTMP
        T = T + 2
    Wend
    ByteStuffing = sOut
End Function

Zo dan? :?

[ Voor 37% gewijzigd door RobIII op 31-08-2004 10:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:25

Janoz

Moderator Devschuur®

!litemod

Waarom zet je die bytes eigenlijk om in een string met hexcode? Als je het gewoon een byte array laat dan heb je maar de helft van de lengte nodig en hoef je niet telkens conversie toe te passen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Janoz schreef op 31 augustus 2004 @ 10:21:
Waarom zet je die bytes eigenlijk om in een string met hexcode? Als je het gewoon een byte array laat dan heb je maar de helft van de lengte nodig en hoef je niet telkens conversie toe te passen.
...en dat zie je overal steeds vaker...
Ik zie zelfs lui een string oversturen met "100100111010111010111...." B)
Volgens mij ontgaat ze het hele idee...Maar die discussie heb ik vaker gevoerd en heb ik echt geen zin meer in :D

[ Voor 9% gewijzigd door RobIII op 31-08-2004 10:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • abeker
  • Registratie: Mei 2002
  • Laatst online: 21:23

abeker

...

Om terug te komen op het oorspronkelijke probleem: Je verhoogt in je loop wel de variabele AantalHexCodes bij iedere wijziging van de string, maar in VB wordt de eindconditie van een For loop maar één keer geparsed. Codes die buiten de oorspronkelijke lengte van de string vallen, worden dus niet vervangen.

the less one forgets, the less one remembers

Pagina: 1