Forum: Mikrocontroller und Digitale Elektronik CRC8 in VB.NET - Finde den Fehler.


von Marc (Gast)


Lesenswert?

Moin,

Ich versuche gerade ein Vb.Net gegenstück zur Bascom CRC8 Checksumme zu 
erstellen. Es soll eine CRC8 über 3 Bytes berechnet werden.

In der Bascom Hilfe ist sogar ein VB6 Code angegeben, allerdings 
funktioniert meine Übersetzung nach Vb.net nicht richtig.

Hier das MCS Beispiel:
1
Function Docrc8(s As String) As Byte
2
3
Dim j As Byte
4
Dim k As Byte
5
Dim crc8 As Byte
6
crc8 = 0
7
8
For m = 1 To Len(s)
9
 x = Asc(Mid(s, m, 1))
10
 For k = 0 To 7
11
  j = 1 And (x Xor crc8)
12
  crc8 = Fix(crc8 / 2) And &HFF
13
  x = Fix(x / 2) And &HFF
14
  If j <> 0 Then
15
  crc8 = crc8 Xor &H8C
16
  End If
17
 Next k
18
Next
19
Docrc8 = crc8
20
End Function

Und hier nun meine Version:
1
Dim buffer(3) as byte
2
3
Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
4
5
        buffer(0) = 1
6
        buffer(1) = 2
7
        buffer(2) = 3
8
9
        Dim j As Byte
10
        Dim crc8 As Byte = 0
11
        For m As Integer = 0 To (buffer.Length - 1)
12
            Dim x As Byte = buffer(m)
13
14
            For k As Integer = 0 To 7
15
                j = CByte(1 And (x Xor crc8))
16
                crc8 = CByte((crc8 / 2) And &HFF)
17
                x = CByte((x / 2) And &HFF)
18
                If j <> 0 Then
19
                    crc8 = CByte(crc8 Xor &H8C)
20
                End If
21
            Next
22
        Next
23
24
        TextBox4.Text = Str(crc8)
25
    End Sub

Für das Array {1, 2, 3} gibt Bascom mir die Checksumme "216" aus,
.Net sagt "0", für {2, 3, 4} .Net "71", Bascom "123"...

Ich komme leider nicht darauf, was da falsch läuft. Hat jemand eine 
Idee?

Vielen Dank!

von Lutz H. (luhe)


Lesenswert?

Die zwei Funktionen sind sehr unterschiedlich.
Ich würde die gleichen Namen und Definitionen verwenden.

von Marc (Gast)


Lesenswert?

Grundsätzlich hast du natürlich recht.
Allerdings geht es im Wesentlichen um den Algorithmus, der trotz 
(vermeintlich) gleichen Berechnungsschritten unterschiedliche Ergebnisse 
liefert.

Zum "spielen" habe ich die Berechnung in eine andere Routine gesetzt, 
die (Bei Click auf einen Button) direkt ausgeführt wird ohne das Array 
vorher an die Funktion übergeben zu müssen...

von Karl H. (kbuchegg)


Lesenswert?

Marc schrieb:
> Grundsätzlich hast du natürlich recht.
> Allerdings geht es im Wesentlichen um den Algorithmus, der trotz
> (vermeintlich) gleichen Berechnungsschritten unterschiedliche Ergebnisse
> liefert.

Dann spick die beiden Code mit Ausgabeanweisungen, so dass du dir auch 
die Zwischenschritte ansehen kannst. Dann kannst du vergleichen, an 
welcher Stelle der vb.net Code abweichende Ergebnisse  bringt.

Es ist nicht verboten, ein Computerprogramm so zu verändern, dass einem 
das Programm selber dabei hilft zu verstehen, welche Berechnungen in 
welcher Reihenfolge gemacht werden und welche Zwischenergebnisse dabei 
entstehen.

von Maxx (Gast)


Lesenswert?

Marc schrieb:
> crc8 = CByte((crc8 / 2) And &HFF)

Ich bin jetzt kein VB.net Experte, aber sollte das Cast nicht vor dem 
and stehen?

(crc8 / 2) müsste in VB.NET ein Double sein. Das And operiert also nicht 
wie gewollt auf einem Integer.

von Marc (Gast)


Lesenswert?

Karl Heinz schrieb:
> Dann spick die beiden Code mit Ausgabeanweisungen, so dass du dir auch
> die Zwischenschritte ansehen kannst. Dann kannst du vergleichen, an
> welcher Stelle der vb.net Code abweichende Ergebnisse  bringt.

Tja, leider habe ich keine VB6 Umgebung installiert, ansonsten natürlich 
eine gute Idee. Werde mich mal kümmern, wo man die schnell herbekommt.

Maxx schrieb:
> Ich bin jetzt kein VB.net Experte, aber sollte das Cast nicht vor dem
> and stehen?
>
> (crc8 / 2) müsste in VB.NET ein Double sein. Das And operiert also nicht
> wie gewollt auf einem Integer.

Hm, ich habe das "CByte" 
https://msdn.microsoft.com/de-de/library/s2dy91zy.aspx als Ersatz für 
das "Fix" http://www.vbarchiv.net/commands/cmd_fix.html gewählt.

Aber irgendwo da wird der Hund wohl begraben liegen ;)

Ich suche weiter und freue mich über Anregungen!

von Marc (Gast)


Lesenswert?

So gehts... warum auch immer

1
Dim s as string
2
 s = Chr(buffer(0)) + Chr(buffer(1)) + Chr(buffer(2))
3
 TextBox5.Text = Str(Docrc8(s))


1
 
2
Function Docrc8(ByVal s As String) As Byte
3
        Dim j As Byte
4
        Dim k As Byte
5
        Dim crc8 As Byte
6
        Dim m As Byte
7
        Dim x As Byte
8
        crc8 = 0
9
        For m = 1 To Len(s)
10
            x = Asc(Mid(s, m, 1))
11
            For k = 0 To 7
12
                j = 1 And (x Xor crc8)
13
                crc8 = Fix(crc8 / 2) And &HFF
14
                x = Fix(x / 2) And &HFF
15
                If j <> 0 Then
16
                    crc8 = crc8 Xor &H8C
17
                End If
18
            Next k
19
        Next
20
        Docrc8 = crc8
21
    End Function

von Maxx (Gast)


Lesenswert?

Marc schrieb:
> Maxx schrieb:
>> Ich bin jetzt kein VB.net Experte, aber sollte das Cast nicht vor dem
>> and stehen?
>>
>> (crc8 / 2) müsste in VB.NET ein Double sein. Das And operiert also nicht
>> wie gewollt auf einem Integer.
>
> Hm, ich habe das "CByte"
> https://msdn.microsoft.com/de-de/library/s2dy91zy.aspx als Ersatz für
> das "Fix" http://www.vbarchiv.net/commands/cmd_fix.html gewählt.
>
> Aber irgendwo da wird der Hund wohl begraben liegen ;)

Du wendest das CByte aber NACH dem UND an.
Das Fix hingegen VOR dem UND.

von Marc (Gast)


Lesenswert?

Maxx schrieb:
> Du wendest das CByte aber NACH dem UND an.
> Das Fix hingegen VOR dem UND.

Asche auf mein Haupt.
Mit dem Fix vor dem AND gehts auch mit dem Bytearray, das CByte war ne 
doofe Idee.

Falls es irgendwann nochmal wer braucht, das hier geht funzt ganz gut:
1
 Dim j As Byte
2
        Dim crc8 As Byte = 0
3
        For m As Integer = 0 To (buffer.Length - 1)
4
            Dim x As Byte = buffer(m)
5
6
            For k As Integer = 0 To 7
7
                j = 1 And (x Xor crc8)
8
                crc8 = Fix((crc8 / 2)) And &HFF
9
                x = Fix((x / 2)) And &HFF
10
                If j <> 0 Then
11
                    crc8 = crc8 Xor &H8C
12
                End If
13
            Next
14
        Next

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.