CRC16 erstellen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    CRC16 erstellen

    Hallo zusammen,
    ich brauche dringend Hilfe beim erstellen einer CRC16 Checksumme!
    In
    der Programmierung bin ich noch recht frisch dabei und komm auch nach
    Stunden der Versuche, Tests und Recherchieren nicht weiter.
    Es wäre Klasse wenn mir Hilf Anstoß geben werden kann.
    Aus
    einer Hexzahl z.B.„050F05B00000C8C2“ soll eine CRC16 Checksumme
    gebildet werden.
    Nach einem Kalkulationsprogramm soll dabei „E1A8“ bzw.
    „A8E1“herauskommen.
    Die Berechnung soll dabei nachfolgendem Algorithmus erfolgen:
    {&H0, &Hc0c1, &Hc181, &H140, &Hc301, &H3c0, _
    &
    H280, &Hc241, &Hc601, &H6c0, &H780, &Hc741, _
    &H500, &Hc5c1, &Hc481, &H440, &Hcc01, &Hcc0, _
    &Hd80, &Hcd41, &Hf00, &Hcfc1, &Hce81, &He40, _
    &Ha00, &Hcac1, &Hcb81, &Hb40, &Hc901, &H9c0, _
    &
    H880, &Hc841, &Hd801, &H18c0, &H1980, &Hd941, _
    &H1b00, &Hdbc1, &Hda81, &H1a40, &H1e00, &Hdec1, _
    &
    Hdf81, &H1f40, &Hdd01, &H1dc0, &H1c80, &Hdc41, _
    &H1400, &Hd4c1, &Hd581, &H1540, &Hd701, &H17c0, _
    &H1680, &Hd641, &Hd201, &H12c0, &H1380, &Hd341, _
    &
    H1100, &Hd1c1, &Hd081, &H1040, &Hf001, &H30c0, _
    &H3180, &Hf141, &H3300, &Hf3c1, &Hf281, &H3240, _
    &H3600, &Hf6c1, &Hf781, &H3740, &Hf501, &H35c0, _
    &
    H3480, &Hf441, &H3c00, &Hfcc1, &Hfd81, &H3d40, _
    &Hff01, &H3fc0, &H3e80, &Hfe41, &Hfa01, &H3ac0, _
    &H3b80, &Hfb41, &H3900, &Hf9c1, &Hf881, &H3840, _
    &H2800, &He8c1, &He981, &H2940, &Heb01, &H2bc0, _
    &H2a80, &Hea41, &Hee01, &H2ec0, &H2f80, &Hef41, _
    &H2d00, &Hedc1, &Hec81, &H2c40, &He401, &H24c0, _
    &H2580, &He541, &H2700, &He7c1, &He681, &H2640, _
    &
    H2200, &He2c1, &He381, &H2340, &He101, &H21c0, _
    &
    H2080, &He041, &Ha001, &H60c0, &H6180, &Ha141, _
    &
    H6300, &Ha3c1, &Ha281, &H6240, &H6600, &Ha6c1, _
    &Ha781, &H6740, &Ha501, &H65c0, &H6480, &Ha441, _
    &
    H6c00, &Hacc1, &Had81, &H6d40, &Haf01, &H6fc0, _
    &H6e80, &Hae41, &Haa01, &H6ac0, &H6b80, &Hab41, _
    &H6900, &Ha9c1, &Ha881, &H6840, &H7800, &Hb8c1, _
    &Hb981, &H7940, &Hbb01, &H7bc0, &H7a80, &Hba41, _
    &Hbe01, &H7ec0, &H7f80, &Hbf41, &H7d00, &Hbdc1, _
    &Hbc81, &H7c40, &Hb401, &H74c0, &H7580, &Hb541, _
    &H7700, &Hb7c1, &Hb681, &H7640, &H7200, &Hb2c1, _
    &Hb381, &H7340, &Hb101, &H71c0, &H7080, &Hb041, _
    &H5000, &H90c1, &H9181, &H5140, &H9301, &H53c0, _
    &H5280, &H9241, &H9601, &H56c0, &H5780, &H9741, _
    &H5500, &H95c1, &H9481, &H5440, &H9c01, &H5cc0, _
    &H5d80, &H9d41, &H5f00, &H9fc1, &H9e81, &H5e40, _
    &H5a00, &H9ac1, &H9b81, &H5b40, &H9901, &H59c0, _
    &H5880, &H9841, &H8801, &H48c0, &H4980, &H8941, _
    &H4b00, &H8bc1, &H8a81, &H4a40, &H4e00, &H8ec1, _
    &
    H8f81, &H4f40, &H8d01, &H4dc0, &H4c80, &H8c41, _
    &
    H4400, &H84c1, &H8581, &H4540, &H8701, &H47c0, _
    &
    H4680, &H8641, &H8201, &H42c0, &H4380, &H8341, _
    &H4100, &H81c1, &H8081, &H4040}
    Freue mich auf Konstruktive Vorschläge..
    Danke schon mal im voraus..
    mfg
    Wie wäre es wenn du das was herauskommen soll in einen Expander und in einen Code-Block verschiebst ? So sieht der Beitrag übersichtlicher aus ;)
    Software being "Done" is like lawn being "Mowed". (Jim Benson)

    vb_neuling schrieb:

    Freue mich auf Konstruktive Vorschläge.
    Sollen wir Deine Hausaufgaben machen? X(
    In diesem Falle solltest Du das Marktplatz-Forum frequentieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es sollen für mich natürlich keine Hausaufgaben gemacht werden!!

    Ich hab bereits einen Programmcode, komme aber jetzt nicht mehr weiter!

    Wie gesagt aller Anfang ist schwer und würde mich freuen wenn jemand einen Blick darüber werfen kann und mir sagen kann wo der Fehler liegt!

    Spoiler anzeigen


    Public Class Form1

    Sub Crc()

    Dim Data As Byte
    Dim DataSet As String
    Dim DataWord As String

    Dim CRCsum As Integer
    Dim CRCsumString As String

    Dim i As Integer


    CRCsum = 0

    DataSet = "050F05B59A993141"

    For i = 1 To (Len(DataSet) / 2)
    DataWord = Mid(DataSet, (i * 2) - 1, 2)
    Data = CLng("&H" & DataWord)
    CRCsum = Crc16(CRCsum, Data)
    Next i

    CRCsumString = Hex(CRCsum)

    If Len(CRCsumString) Mod 2 <> 0 Then
    CRCsumString = "0" & CRCsumString
    End If

    CRCsumString = Mid(CRCsumString, 3, 2) & Mid(CRCsumString, 1, 2)

    MsgBox(CRCsumString)

    End Sub


    Public Class Crc16
    Private Shared CrcTable As UShort() = {&H0, &HC0C1, &HC181, &H140, &HC301, &H3C0, _
    &H280, &HC241, &HC601, &H6C0, &H780, &HC741, &H500, &HC5C1, &HC481, &H440, &HCC01, &HCC0, &HD80, &HCD41, &HF00, &HCFC1, &HCE81, &HE40, _
    &HA00, &HCAC1, &HCB81, &HB40, &HC901, &H9C0, &H880, &HC841, &HD801, &H18C0, &H1980, &HD941, &H1B00, &HDBC1, &HDA81, &H1A40, &H1E00, &HDEC1, _
    &HDF81, &H1F40, &HDD01, &H1DC0, &H1C80, &HDC41, &H1400, &HD4C1, &HD581, &H1540, &HD701, &H17C0, &H1680, &HD641, &HD201, &H12C0, &H1380, &HD341, _
    &H1100, &HD1C1, &HD081, &H1040, &HF001, &H30C0, &H3180, &HF141, &H3300, &HF3C1, &HF281, &H3240, &H3600, &HF6C1, &HF781, &H3740, &HF501, &H35C0, _
    &H3480, &HF441, &H3C00, &HFCC1, &HFD81, &H3D40, &HFF01, &H3FC0, &H3E80, &HFE41, &HFA01, &H3AC0, &H3B80, &HFB41, &H3900, &HF9C1, &HF881, &H3840, _
    &H2800, &HE8C1, &HE981, &H2940, &HEB01, &H2BC0, &H2A80, &HEA41, &HEE01, &H2EC0, &H2F80, &HEF41, &H2D00, &HEDC1, &HEC81, &H2C40, &HE401, &H24C0, _
    &H2580, &HE541, &H2700, &HE7C1, &HE681, &H2640, &H2200, &HE2C1, &HE381, &H2340, &HE101, &H21C0, &H2080, &HE041, &HA001, &H60C0, &H6180, &HA141, _
    &H6300, &HA3C1, &HA281, &H6240, &H6600, &HA6C1, &HA781, &H6740, &HA501, &H65C0, &H6480, &HA441, &H6C00, &HACC1, &HAD81, &H6D40, &HAF01, &H6FC0, _
    &H6E80, &HAE41, &HAA01, &H6AC0, &H6B80, &HAB41, &H6900, &HA9C1, &HA881, &H6840, &H7800, &HB8C1, &HB981, &H7940, &HBB01, &H7BC0, &H7A80, &HBA41, _
    &HBE01, &H7EC0, &H7F80, &HBF41, &H7D00, &HBDC1, &HBC81, &H7C40, &HB401, &H74C0, &H7580, &HB541, &H7700, &HB7C1, &HB681, &H7640, &H7200, &HB2C1, _
    &HB381, &H7340, &HB101, &H71C0, &H7080, &HB041, &H5000, &H90C1, &H9181, &H5140, &H9301, &H53C0, &H5280, &H9241, &H9601, &H56C0, &H5780, &H9741, _
    &H5500, &H95C1, &H9481, &H5440, &H9C01, &H5CC0, &H5D80, &H9D41, &H5F00, &H9FC1, &H9E81, &H5E40, &H5A00, &H9AC1, &H9B81, &H5B40, &H9901, &H59C0, _
    &H5880, &H9841, &H8801, &H48C0, &H4980, &H8941, &H4B00, &H8BC1, &H8A81, &H4A40, &H4E00, &H8EC1, &H8F81, &H4F40, &H8D01, &H4DC0, &H4C80, &H8C41, _
    &H4400, &H84C1, &H8581, &H4540, &H8701, &H47C0, &H4680, &H8641, &H8201, &H42C0, &H4380, &H8341, &H4100, &H81C1, &H8081, &H4040}

    End Class


    End Class



    @Eierlein: Hast recht, hab ich nicht darauf geachtet! Kleinigkeit führen oft zu Missverständnisse!! Es muss natürlich "&h05, &h0F, &h05, &hB0, &h00, &h00, &hC8, &hC2" lauten.

    vb_neuling schrieb:

    wo der Fehler liegt!
    1. Gib Deinem Projekt Option Strict On.
    2. VB.NET-Quellcode

      1. For i = 0 To DataSet.Length - 1 Step 2
      2. DataWord = DataSet.Substring(i, 2)
      3. Data = Convert.ToByte(DataWord, 16)
      4. 'CRCsum = Crc16(CRCsum, Data)
      5. Next i

    3. Gib dieser Prozedur einen Namen und einen Body:

      VB.NET-Quellcode

      1. CRCsum = Crc16(CRCsum, Data)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    vb_neuling schrieb:

    hinaus
    Was sagt Dein Compiler zu dieser Codezeile:

    VB.NET-Quellcode

    1. CRCsum = Crc16(CRCsum, Data)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @vb_neuling:: Was soll dieser Aufruf bezwecken? Was ist der Output dieser Funktion, die fälschlicherweise den Namen ihrer Klasse hat.
    (das war ein Wink mit dem Zaunspfahl :thumbsup: )
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany: Erst mal danke für deinen Einsatz!

    ..muss aber sagen, ich steh voll auf dem Schlauch und komm nicht weiter.

    Das

    VB.NET-Quellcode

    1. CRCsum = Crc16(CRCsum, Data)

    nicht den Namen der Klasse tragen darf habe ich in zwischen geschnitten, komm aber nicht weiter wie ich in der Funktion die Daten aus der "Class Crc16" bekomme..
    @vb_neuling:: Meinst Du so was:
    Public Class Crc16

    VB.NET-Quellcode

    1. Public Class Crc16
    2. Private Shared CrcTable As UShort() = {&H0, &HC0C1, &HC181, &H140, &HC301, &H3C0, _
    3. &H280, &HC241, &HC601, &H6C0, &H780, &HC741, &H500, &HC5C1, &HC481, &H440, &HCC01, &HCC0, &HD80, &HCD41, &HF00, &HCFC1, &HCE81, &HE40, _
    4. &HA00, &HCAC1, &HCB81, &HB40, &HC901, &H9C0, &H880, &HC841, &HD801, &H18C0, &H1980, &HD941, &H1B00, &HDBC1, &HDA81, &H1A40, &H1E00, &HDEC1, _
    5. &HDF81, &H1F40, &HDD01, &H1DC0, &H1C80, &HDC41, &H1400, &HD4C1, &HD581, &H1540, &HD701, &H17C0, &H1680, &HD641, &HD201, &H12C0, &H1380, &HD341, _
    6. &H1100, &HD1C1, &HD081, &H1040, &HF001, &H30C0, &H3180, &HF141, &H3300, &HF3C1, &HF281, &H3240, &H3600, &HF6C1, &HF781, &H3740, &HF501, &H35C0, _
    7. &H3480, &HF441, &H3C00, &HFCC1, &HFD81, &H3D40, &HFF01, &H3FC0, &H3E80, &HFE41, &HFA01, &H3AC0, &H3B80, &HFB41, &H3900, &HF9C1, &HF881, &H3840, _
    8. &H2800, &HE8C1, &HE981, &H2940, &HEB01, &H2BC0, &H2A80, &HEA41, &HEE01, &H2EC0, &H2F80, &HEF41, &H2D00, &HEDC1, &HEC81, &H2C40, &HE401, &H24C0, _
    9. &H2580, &HE541, &H2700, &HE7C1, &HE681, &H2640, &H2200, &HE2C1, &HE381, &H2340, &HE101, &H21C0, &H2080, &HE041, &HA001, &H60C0, &H6180, &HA141, _
    10. &H6300, &HA3C1, &HA281, &H6240, &H6600, &HA6C1, &HA781, &H6740, &HA501, &H65C0, &H6480, &HA441, &H6C00, &HACC1, &HAD81, &H6D40, &HAF01, &H6FC0, _
    11. &H6E80, &HAE41, &HAA01, &H6AC0, &H6B80, &HAB41, &H6900, &HA9C1, &HA881, &H6840, &H7800, &HB8C1, &HB981, &H7940, &HBB01, &H7BC0, &H7A80, &HBA41, _
    12. &HBE01, &H7EC0, &H7F80, &HBF41, &H7D00, &HBDC1, &HBC81, &H7C40, &HB401, &H74C0, &H7580, &HB541, &H7700, &HB7C1, &HB681, &H7640, &H7200, &HB2C1, _
    13. &HB381, &H7340, &HB101, &H71C0, &H7080, &HB041, &H5000, &H90C1, &H9181, &H5140, &H9301, &H53C0, &H5280, &H9241, &H9601, &H56C0, &H5780, &H9741, _
    14. &H5500, &H95C1, &H9481, &H5440, &H9C01, &H5CC0, &H5D80, &H9D41, &H5F00, &H9FC1, &H9E81, &H5E40, &H5A00, &H9AC1, &H9B81, &H5B40, &H9901, &H59C0, _
    15. &H5880, &H9841, &H8801, &H48C0, &H4980, &H8941, &H4B00, &H8BC1, &H8A81, &H4A40, &H4E00, &H8EC1, &H8F81, &H4F40, &H8D01, &H4DC0, &H4C80, &H8C41, _
    16. &H4400, &H84C1, &H8581, &H4540, &H8701, &H47C0, &H4680, &H8641, &H8201, &H42C0, &H4380, &H8341, &H4100, &H81C1, &H8081, &H4040}
    17. Public Shared Function CrcValue(index As Integer) As UShort
    18. If index < 0 OrElse index >= CrcTable.Length Then
    19. Throw New IndexOutOfRangeException()
    20. End If
    21. Return CrcTable(index)
    22. End Function
    23. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @vb_neuling:: Also:
    Ich suche einen Algorithmus zur Berechnung einer CRC Prüfsumme.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany: :) ich glaub jetzt reden wir an einander vorbei...

    in dem Code:

    VB.NET-Quellcode

    1. For i = 0 To DataSet.Length - 1 Step 2
    2. DataWord = DataSet.Substring(i, 2)
    3. Data = Convert.ToByte(DataWord, 16)
    4. CRCsum = Crc16(CRCsum, Data)
    5. Next i
    6. CRCsumString = Hex(CRCsum)
    7. If Len(CRCsumString) Mod 2 <> 0 Then
    8. CRCsumString = "0" & CRCsumString
    9. End If
    10. CRCsumString = Mid(CRCsumString, 3, 2) & Mid(CRCsumString, 1, 2)
    11. MsgBox(CRCsumString)
    12. End Sub
    13. Public Class Crc16
    14. Private Shared CrcTable As UShort() = { _
    15. &H0, &HC0C1, &HC181, &H140, &HC301, &H3C0, _
    16. &H280, &HC241, &HC601, &H6C0, &H780, &HC741, _
    17. &H500, &HC5C1, &HC481, &H440, &HCC01, &HCC0, _
    18. &HD80, &HCD41, &HF00, &HCFC1, &HCE81, &HE40, _
    19. &HA00, &HCAC1, &HCB81, &HB40, &HC901, &H9C0, _
    20. &H880, &HC841, &HD801, &H18C0, &H1980, &HD941, _
    21. &H1B00, &HDBC1, &HDA81, &H1A40, &H1E00, &HDEC1, _
    22. &HDF81, &H1F40, &HDD01, &H1DC0, &H1C80, &HDC41, _
    23. &H1400, &HD4C1, &HD581, &H1540, &HD701, &H17C0, _
    24. &H1680, &HD641, &HD201, &H12C0, &H1380, &HD341, _


    muss die Zeile:

    VB.NET-Quellcode

    1. CRCsum = Crc16(CRCsum, Data)

    ersetzt werden.
    Ich komm aber nicht dahinter wie! ..soweit bin ich mit meinen Kenntnissen in VB leider noch nicht!

    vb_neuling schrieb:

    ersetzt werden.
    Was soll passieren, wenn der Code der ersetzten Zeile ausgeführt wird?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!