Nach Zeile 32 im C#-Programm fehlt
Es ist aber nicht korrekt, bei ungerader Blockgröße einfach 0xFF-Bytes
einzufügen (das ist im C++-Programm schon falsch):
1 | if (size & 0x01) {
|
2 | printf("Add one byte because odd file length\n\r");
|
3 | fileData[size] = 0xFF;
|
4 | size++;
|
5 | }
|
Das muss man vermutlich am Ende der Datei machen, aber ganz sicher nicht
in der Mitte, weil sonst das CRC-Ergebnis davon abhängt, wie die die
Datei beim Einlesen gestückelt wird.
Bei gewöhnlichen Dateien tritt der Fehler wahrscheinlich nicht in
Erscheinung, da die fread- bzw. Read-Funktion bei jedem Aufruf bis auf
den letzten die gewünschte Anzahl von Bytes (2048) lesen wird und 2048
eine gerade Zahl ist.
Ist die Datenquelle aber keine Datei, sondern bspw. eine serielle
Schnittstelle, wird die Funktion ziemlich sicher bei gleichen Daten
jedesmal ein anderes Ergebnis liefern.
Ich verstehe aber sowieso nicht, warum im Originalprogramm die Daten
16-bit-weise verarbeitet werden. Durch die Art und Weise, wie dies
gemacht wird, hängt das Ergebnis nämlich zusätzlich von der Endianess
der verwendeten Plattform ab.
Das Originalprogramm ist also ziemlicher Murks. Wenn du dazu kompatibel
bleiben musst, kannst du diesen Murks übernehmen. Wenn du aber eine
ordentliche CRC berechnen möchtest, solltest du dir eine andere Vorlage
suchen.