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
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...
So wie ich das verstanden habe(Fix-VB-Referenz) entspricht der Fix-Befehl in VB ungefähr der Math.Round()_methode in c#.
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.
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.
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!
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).
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");
}
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