BCC Checksumme berechnen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    BCC Checksumme berechnen

    Hi!

    Für ein Laborgerät soll die BCC (Block Check Character) Prüfsumme berechnet werden. Grundsätzlich ergibt sich diese durch XOR aller Zeichen zwischen <STX> und <ETX>, wobei <ETX> ebenfalls einbezogen wird. Der Hersteller gibt die Berechnung wie folgt an:

    The BCC is a 2 digit checksum calculated using the Exclusive OR (Xor) of all the characters in the transmitted or
    received message between (but NOT including) <STX> and <ETX>.


    Der Hersteller hat auch noch eine Testdaten angegeben:

    <STX>2||20021211163215|3^005^3<CR>
    R|3|^^^300|0.97|INR||L||X||OP1||20021211163215|5^004^1<CR>
    R|4|^^^300|112.2|||L||X||112||20070808181200|9<CR>
    C|1|I|1017^probe temperature warning|I<CR>
    L|1|N<ETX>EE<CR><LF>


    Allerdings erhalte ich als Prüfsumme immer "7A" (Hex). Mein Code:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. Dim Test As String = ""
    3. Dim BCC As String = ""
    4. Test = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "/test.txt", System.Text.Encoding.Default)
    5. Test = Test.Substring(Test.IndexOf(ChrW(2)) + 1)
    6. Test = Test.Substring(0, Test.IndexOf(ChrW(3)) + 1)
    7. BCC = GetBCC(System.Text.Encoding.Default.GetBytes(Test))
    8. End Sub
    9. Public Shared Function GetBCC(inputStream As Byte()) As String
    10. Dim bcc As Byte = 0
    11. If inputStream IsNot Nothing AndAlso inputStream.Length > 0 Then
    12. For i As Integer = 0 To inputStream.Length - 1
    13. bcc = bcc Xor inputStream(i)
    14. Next
    15. End If
    16. Return Hex(bcc)
    17. End Function


    Ich hab auch versucht im Netz etwas dazu zu finden, aber alle Lösungen führen zu einem XOR wie bei mir.

    Beispiel 2 (ACHTUNG: <ETB> statt <ETX>)
    <STX>1H|@^\|1025080549_50||7|||||LIS-HOST-06||P|1394-
    97|20000614080624<CR>
    P|1|||||||<CR>
    O|1|444|108315|^^^300|R|20040420094213|||||Q||||3^56656|003|||||||||F<CR>
    R|1|^^^300|106.01|%||N||F||OP1||20021211163215|0^001^5<CR>
    R|2|^^^300|12.65|sec||N||P||OP1<ETB>D5<CR><LF>


    Im Anhang ist das File "test.txt" zu finden, das sind die Daten von Beispiel 1 mit dennen ich es versucht habe.

    Kann mir irgendjemand helfen die Checksumme zu berechnen?

    LG
    Domsi

    EDIT: Die Checksumme findet man jeweils nach <ETX> bzw. <ETB>
    Dateien
    • test.txt

      (178 Byte, 193 mal heruntergeladen, zuletzt: )
    • bsp2.txt

      (239 Byte, 151 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Domsi“ ()

    Domsi schrieb:

    2 digit
    bedeutet was bitte?
    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!

    Domsi schrieb:

    2 stellige
    AHa, also 2 Hex-Stellen. Ich hatte vermutet, 2Bytes.
    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!

    Domsi schrieb:

    erhalte ich als Prüfsumme
    mit diesem Code

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim line = IO.File.ReadAllText("C:\Temp\CheckSum.txt")
    3. Dim cc() = line.ToCharArray
    4. Dim start = line.IndexOf(Convert.ToChar(2)) ' STX
    5. Dim ende = line.IndexOf(Convert.ToChar(3)) ' ETX
    6. Dim index = 0
    7. Dim sum = 0
    8. For i = start + 1 To ende - 1
    9. Dim value = Convert.ToInt32(cc(i))
    10. sum = sum Xor value
    11. index = i ' zum Testen des letzten Index'
    12. Next
    13. MessageBox.Show(sum.ToString("X2"))
    14. End Sub
    erhalte ich 0x79.
    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 schrieb:


    erhalte ich 0x79.

    Ja wenn ich das <ETX> nicht berücksichtige, dann komme ich auch auf 0x79. Wenn ich es mit <ETX> mache, dann komme ich auf 0x7A (auch mit deinem Code). Aber beides ist falsch, da der Hersteller die Checksumme mit 0xEE angibt.


    petaod schrieb:

    ist nicht völlig eindeutig, aber heisst für mich, dass weder STX noch ETX bei der Berechnung berücksichtigt werden.

    Jap es ist nicht 100% sicher, allerdings habe ich alle Versuche MIT und OHNE <ETX> gemacht -> Meine berechnete Checksumme ist für beide Fälle weit vom Soll-Wert entfernt.

    Eierlein schrieb:

    Wenn ich statt XOR "+" nehme erhalte ich bei der testdatei Hex 33EE

    Jap da hast du recht, allerdings funktioniert das bei Beispiel 2 wiederrum nicht. Habe hierzu auch noch eine Testdatei "Bsp2.txt" hochgeladen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Domsi“ ()

    Kannst Du Support beim

    Domsi schrieb:

    Hersteller
    abgreifen?
    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 schrieb:

    Kannst Du Support beim

    Domsi schrieb:
    Hersteller

    abgreifen?


    Leider nur sehr schwer, der Hersteller sitzt in Japan und der Kunde hat es über einen Importeur eingekauft.

    Domsi schrieb:

    Eierlein schrieb:
    Wenn ich statt XOR "+" nehme erhalte ich bei der testdatei Hex 33EE


    Jap da hast du recht, allerdings funktioniert das bei Beispiel 2 wiederrum nicht. Habe hierzu auch noch eine Testdatei "Bsp2.txt" hochgeladen.


    Korrigiere der Tipp von "Eierlein" hat doch geholfen... Möglicherweise ist bei Beispiel2 ein Fehler, aber bei allen anderen Daten (die das Laborgerät) sendet, funktioniert die Addition und anschließend mit 0xFF maskieren.

    In Verbindung mit dem Code von "RodFromGermany" funktioniert es dann:

    VB.NET-Quellcode

    1. Dim line = IO.File.ReadAllText(Application.StartupPath & "/test.txt")
    2. Dim cc() = line.ToCharArray
    3. Dim start = line.IndexOf(Convert.ToChar(2)) ' STX
    4. Dim ende = line.IndexOf(Convert.ToChar(3)) ' ETX
    5. Dim index = 0
    6. Dim sum = 0
    7. For i = start + 1 To ende
    8. Dim value = Convert.ToInt32(cc(i))
    9. sum = sum + value
    10. index = i ' zum Testen des letzten Index'
    11. Next
    12. sum = (sum And &HFF)
    13. MessageBox.Show(sum.ToString("X2"))