C++ zu C# Code konvertieren

Gast #2704667
Lesenswert?

Hei Leute

Ich versuche gerade eine C++ Awendung auf .Net umzuschreiben. Leider 
habe ich ein Problem mit dieser CRC Kalkulierung. Da sie etwas speziell 
ist, benötige ich Sie genau so wie im C++-File. Ich habe das ganze 
umgeschrieben nur irgendwie funktioniert das Ding nicht!

Könnte mir vielleicht jemand sagen wo mein Fehler liegt. Ich seh' 
irgendwie den Wald vor lauter Bäumen nicht mehr..

Danke und Gruss

Farin
Angehängte Dateien:
Gast #2704670
Lesenswert?

>  StreamReader sr = new StreamReader(file);

http://msdn.microsoft.com/de-de/library/system.io.streamreader%28v=vs.80%29.aspx

Implementiert einen TextReader, der Zeichen aus einem Bytestream in 
einer bestimmten Codierung liest.

Das ist bestimmt nicht was du willst. Du solltest einen binary Reader 
verwenden.


http://msdn.microsoft.com/de-de/library/system.io.binaryreader.aspx
Moderator #2704767
Lesenswert?

Nach Zeile 32 im C#-Programm fehlt
1
  size++;

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.
#2704800
Lesenswert?

Yalu X. schrieb:

> 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.

Ergänzend:
Es würde mich schon sehr wundern, wenn es in der umfangreichen .Net 
Bibliothek nicht schon eine fix&fertige CRC Berechnung gäbe.
Gast #2704814
Lesenswert?

Es gibt alles fixfertig. Aber das Problem ist. Dieser Algorythmus wurde 
auf einer integrierten Schaltung verwendet. Und um diese Schaltung noch 
verwenden zu können muss mein Tool diese spezielle CRC auch so berechnen 
können.

Ich weiss es ist nervig und ich würde jeden anderen Weg bevorzugen aber 
es geht nunmal einfach nicht anders...
Gast #2704902
Lesenswert?

Ok Leute ich habs! Das Problem war effektiv das ushort/byte array in das 
ich die Daten kopiert habe. Ich habe das Kopieren der Daten nun 
folgendermassen realisiert und schon gehts perfekt wie ichs wollte:
1
 if ((rdr.BaseStream.Length - rdr.BaseStream.Position) >= 2048)
2
 {
3
     Buffer.BlockCopy(rdr.ReadBytes(2048), 0,fileBuffer, 0, 2048);
4
     size = 2048;
5
 }
6
 else
7
 {
8
     int tempsize = (int)(rdr.BaseStream.Length - rdr.BaseStream.Position);
9
     Buffer.BlockCopy(rdr.ReadBytes(2048), 0, fileBuffer, 0, tempsize);
10
     size = tempsize;
11
 }

Danke an alle Helfer. Ihr seid super!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren