mikrocontroller.net

Forum: PC-Programmierung crc über struct c#


Autor: pingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde,
ich habe ein Problem bei dem ich als absoluter Anfänger nicht mehr 
weiter komme.
Ich habe folgende Structur und muß eine CRC Prüfsumme erzeugen.
Die Methode zur Erstellung der CRC möchte ein byte array haben.
Zu meinem Problem wie kann ich aus der Structur ein byte Array erzeugen 
und wie aus einem Array eine Structur?
ich hoffe ich konnte meine Frage einiger Massen deutlich stellen.
public struct Protocol
        {
            public byte adress;
            public byte  command;
            public byte len;
            public Int16 [] recivebuffer;
            public int Rtimeout;
            public Int16 rec_CRC;
        };

Gruß

Pingo

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
C# ist eine Hochsprache und da kann man sich nicht darauf verlassen das 
die Bytes in einer Struktur so hintereinanderliegen wie man das 
maschinennah gerne hätte. Deshalb ist das hier etwas 'umständlicher':
- einen MemoryStream ms erzeugen
- einen BinaryWriter bw(ms) erzeugen
- die Elemente nacheinander mit bw.Write(data) in den Stream schreiben
- aus dem Stream ein Array erzeugen mit byte[] ba = ms.ToArray();

Alternativ kann man eine Struktur mit Marshalling Attributen versehen 
und mit Pointern hantieren, aber das ist weniger im Sinne von .Net.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> - die Elemente nacheinander mit bw.Write(data) in den Stream schreiben

Das wird so (noch) nix, weil die Endianness noch nicht erklärt ist 
(betrifft hier int und int16). Abgesehen davon gehts auch ohne Umweg: 
Ein byte[] hinreichender Größe erzeugen, die Daten (unter Beachtung der 
Endianness) byteweise reinkopieren, fertig.

HTH und HF

Autor: pingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Deine Antwort.
hast du vielleicht ein Beispiel ?

Pingo

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
struct Protocol x = ..;
int länge = sizeof(struct Protocol) -sizeof(int16*) +x.len;
byte[] b = new byte[länge];
int i = 0;
b[i] = x.adress; i++;
b[i] = x.command; i++;
b[i] = x.len; i++;

for (int j = 0; j < x.len; j++) {
   b[i] =  x.recivebuffer[j]       & 0xFF; i++;
   b[i] = (x.recivebuffer[j] >> 8) & 0xFF; i++;
}

b[i] =  x.Rtimeout       & 0xFF; i++;
b[i] = (x.Rtimeout >> 8) & 0xFF); i++;

Der Süntacktische Schugar verbleibt beim geneigten Hausaufgabenmacher 
;-) Und ich kann hier gerade weder Syntax noch Semantik überprüfen weil 
ich gerade keinen Siehäsch-Compiler zur Hand hab - die Grundidee sollte 
aber rüberkommen.

Ob Big- oder Little-Endian (hier: letzteres) steht in der Protokolldoku. 
Ob die crc32 mit dazgehört, ggf. mit Nullen aufgefüllt, ob die Eingabe 
sonstwie aufgefüllt werden muss oder sonst noch was fehlt, das steht in 
der Doku :-)

HTH und HF

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich stelle grad fest ein int ist 4 Bytes groß, also musses heissen..
[..]
int länge = sizeof(struct Protocol) -sizeof(int16*) +x.len *4;
[..]
for (int j = 0; j < x.len; j++) {
   b[i] =  x.recivebuffer[j]        & 0xFF; i++;
   b[i] = (x.recivebuffer[j] >>  8) & 0xFF; i++;
   b[i] = (x.recivebuffer[j] >> 16) & 0xFF; i++;
   b[i] = (x.recivebuffer[j] >> 24) & 0xFF; i++;
}
</ingrid>

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das die BinaryWriter Lösung nur Little-Endian kann ist richtig, sieht 
aber eleganter aus, vor allem wenn noch 32Bit Integer, Floating Point 
oder Textfelder in das Protokoll reinsollen. Ist dann vielleicht 
geschmacksache und glücksache das die Formate passen.

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn der receiveBuffer[] eine unbestimmte Länge hat wird 
sizeof(struct Protocol) nichts brauchbares liefern.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> und wenn der receiveBuffer[] eine unbestimmte Länge hat wird
> sizeof(struct Protocol) nichts brauchbares liefern.

Der soll genau die Größe der Stuktur liefern (inklusive des Zeigers auf 
das Array, der danach wieder abgezogen wird - oder ist das in Siehäsch 
anders definiert?). Die Größe des Datenpakets interpretiere ich jetzt 
einfach mal als das Feld len. Damit weiss man dann genau wie groß das 
Datenpaket wirklich ist (in Bytes).

Ob Big oder Litte, das steht wie gesagt in der Protokollspeck. Wie 
Floats anzugeben sind ebenso. Und der ganze Rest natürlich auch :-) In 
der Regel ist es zweckmäßig ebendieses Speck zu lesen ;-)

HTH und HF

Autor: pingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,
für Eure Hilfe !


PINGO

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum kam mir das ganze nur so bekannt vor...
Beitrag "C# Leidiges Thema Struct to byte array / byte array to Struct"
beantwortet wurde es auch schon mal vor knapp zwei Jahren...
Beitrag "structur in C# empfangen"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.