CRC8 in VB.NET - Finde den Fehler.

Gast #4149681
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!
Gast #4149693
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...
#4149723
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.
Gast #4149747
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!
Gast #4149779
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
Gast #4149830
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.
Gast #4149852
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.