Laden...

Vb Code für crc8 Prüfsumme in C# umsetzen

Erstellt von voXdie vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.599 Views
V
voXdie Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren
Vb Code für crc8 Prüfsumme in C# umsetzen

Hallo & guten Mittag zusammen!

ich bin leider ein ziemlicher Anfänger was programmieren betrifft, nichts desto trotz würde ich gerne den Code für eine crc8 Prüfsumme aus VB in C# "übersetzen".

VB:

The code below shows a VB function of CRC8

Function Docrc8(s As String) As Byte
Dim j As Byte
Dim k As Byte
Dim crc8 As Byte
crc8 = 0
For m = 1 To Len(s)
 x = Asc(Mid(s, m, 1))
 For k = 0 To 7
  j = 1 And (x Xor crc8)
  crc8 = Fix(crc8 / 2) And &HFF
  x = Fix(x / 2) And &HFF
  If j <> 0 Then
  crc8 = crc8 Xor &H8C
  End If
 Next k
Next
Docrc8 = crc8
End Function

was ich daraus in C# gemacht hab sieht wie folgt aus:

       
 static int crc8vb(string input)
        {
            int j;
            int k;
            int x;
            int crc8;            
            crc8 = 0;
            for (int m = 0; m < input.Length; m++)
            {
                x = (int)Convert.ToChar(input.Substring(m,1));
                for (k = 0; k <7; k++)
                {
                    j = 1 & (x^=crc8);
                    crc8 = (crc8 / 2) & 0xFF;
                    x = (x / 2) & 0xFF;
                    if (j != 0)
                    {
                        crc8 = crc8 ^= 0x8C;
                    }
                }
              
            }
            return crc8;
        }

Es "funktioniert" auch, allerdings kommen andere Werte heraus als in VB und ich denke das es was mit dem "FIX" Kommando zu tun hat. Ich kenne leider keine Alternative dazu in C# und suche deshalb hier nach einer Lösung für mein Problem...

Würde mich freuen wenn jemand den entscheidenen Hinweis gibt 😃

Grüße
Jan

4.221 Beiträge seit 2005
vor 11 Jahren

Lade dir den ILSpy runter.

Ursprünglichen Code in VB.Net kompilieren... in ILSpy laden und in C# ansehen.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

U
189 Beiträge seit 2011
vor 11 Jahren

So wie ich das verstanden habe(Fix-VB-Referenz) entspricht der Fix-Befehl in VB ungefähr der Math.Round()_methode in c#.

V
voXdie Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren

So wie ich das verstanden habe( Fix-VB-Referenz) entspricht der Fix-Befehl in VB ungefähr der Math.Round()_methode in c#.

Math.Round rundet so wie ich das verstanden hab ab 0,49 auf. FIX liefert bei 20.6 eine glatte 20 und bei -20.6 eine glatt.

@Programmierhans
Lade es mir grade herunter und probiere es aus, danke.

C
224 Beiträge seit 2009
vor 11 Jahren

Hi, hier mein Vorschlag.:


        public static byte Docrc8(string s)
        {
            byte j;
            byte crc8 = 0;
            for (int m = 0; m < s.Length; m++)
            {
                byte x = (byte)s[m];
                
                for (int k = 0; k <= 7; k++)
                {
                    j = (byte)(1 & (x ^ crc8));
                    crc8 = (byte)((crc8 / 2) & 0xff);
                    x = (byte)((x / 2) & 0xff);
                    if (j != 0) crc8 = (byte)(crc8 ^ 0x8C);
                }
            }
            return crc8;
        }

Wenn ich das richtig verstanden habe, schneidet Fix bei positiven Werten einfach nur die Nachkommastellen ab.

V
voXdie Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren

Richtig, er schneidet einfach die Nachkommastellen ab. Und zu deinem Vorschlag... SUPER! Funktioniert perfekt 😃 Werd mich gleich mal ein wenig mit auseinander setzen wie du das gelöst hast. Auf jedenfall funktioniert es, danke CoLo!

5.742 Beiträge seit 2007
vor 11 Jahren

Kleine Ergänzung: Das ganze sollte man am besten noch in einen unchecked-Block packen, sodass es später nicht wegen irgendwelcher Überläufe (bei der Konvertierung nach byte) knallt (wenn die entsprechende Prüfung in den Buildoptionen eingestellt ist, was sich IMHO empfiehlt).

C
224 Beiträge seit 2009
vor 11 Jahren

Guter Hinweis. Ich habe das jetzt mal bei mir getestet:


        private void btnCheckTest(object sender, EventArgs e)
        {
            int i = 1234;
            byte b;

            b = (byte)i;
            b = Convert.ToByte(i);//Hier knallt's
            unchecked { b = (byte)i; }
            checked { b = (byte)i; }//Hier knallt's

            MessageBox.Show("Done");
        }

C
224 Beiträge seit 2009
vor 11 Jahren

Hi, also das mit der Konvertierung lässt mich jetzt nicht locker. Ich habe dazu jetzt einen neues Thema erstellt:

Konvertierung - Unterschied Convert.ToByte(i) und (byte)i

Gruß, CoLo