C# - Vom Uint16 Block CRC Bilden

Gast #3288655
Lesenswert?
• ▲
▼
Ich tue mich gerade ein wenig schwer mit C#. Eigentlich möchte ich von 
einem 16Bit Datenarray, was ab der Position #1 Nutzdaten mit bekannter 
Länge enthält crc32 Check machen. Die CRC32 Funktion erwartet byte array 
mit Längenangabe. In C kein Problem, memcopy ab Adresse soundso und crc 
Check mit Länge vom int16 Array * 2 aufrufen. In C# habe ich 
folgendermaßen gelöst. Es geht aber sicherlich einfacher und eleganter. 
Würde mich über einen Vorschlag freuen. Ich weiß nicht, wie ich ein eine 
Methode die byte Array erwartet, konvertierte UInt16 Array Version 
übergeben und das ab dem Uint16[1].
1
UInt16 TempInt16 = 0; 
2
byte[] byteArr = new byte[maxPayloadLen * 2];
3

4
for (int i = 0; i < UL_BlocksToTransfer - 1; i++)
5
{
6
  // Initialize size of Array number "i"
7
  TransferBlock[i] = new UInt16[maxPayloadLen + 3];
8
  
9
  // set Length of block (number of registers for data portion) 
10
  TransferBlock[i][0] = maxPayloadLen;
11
  
12
  // fill block with data from binary file
13
  for (int j = 0; j < maxPayloadLen; j++)
14
  {
15
    TransferBlock[i][j + 1] = Stream.ReadUInt16();
16
  }
17
  // Convert UIn16 Array in a double sized byte Array for crc32 check
18
  for (int a = 0; a < maxPayloadLen; a++)
19
  {
20
    TempInt16 = TransferBlock[i][a + 1];
21
    byteArr[2 * a + 1]   = (byte)TempInt16;
22
    byteArr[2 * a]     = (byte)(TempInt16 >> 8);
23
  }
24
  //create crc32 check for this data portion
25
  crc32 = CRC32generate(byteArr, maxPayloadLen);
26
  
27
  TransferBlock[i][maxPayloadLen + 1] = (UInt16)crc32;
28
  TransferBlock[i][maxPayloadLen]     = (UInt16)(crc32 >> 16);
29
}
Gast #3288662
Lesenswert?
• ▲
▼
ARF schrieb:
> In C kein Problem, memcopy ab Adresse soundso und crc
> Check mit Länge vom int16 Array * 2 aufrufen

die Frage ist ob little oder bigendian System.


 byteArr[2 * a + 1]   = (byte)TempInt16;
 byteArr[2 * a]     = (byte)(TempInt16 >> 8);

liefert auf jeden System das gleiche, deine C version mit memcopy 
liefert was anderes.


die brauchst auch nicht erst alles in ein Array zu kopieren. Man kann 
die CRC auch updaten. Also einfach jedes byte einzeln reinstecken. Und 
am ende die CRC auslesen. Damit sollte der code übersichtlicher sein.
Gast #3288693
Lesenswert?
• ▲
▼
Beide Systeme sind little endian Systeme.
>die brauchst auch nicht erst alles in ein Array zu kopieren. Man kann
>die CRC auch updaten. Also einfach jedes byte einzeln reinstecken. Und
>am ende die CRC auslesen. Damit sollte der code übersichtlicher sein.
CRC32 onthefly Bildung möchte ich vermeiden.
Gast #3288764
Lesenswert?
• ▲
▼
Danke für den Hinweis, ein technisches Problem im wahren Sinne habe ich 
nicht. Mein Code tut die Arbeit. Die Frage war jedoch, ob man es mit dem 
umfassenden C# Framework eleganter lösen kann. So kann ich bei der 
Arbeit auch was Neues lernen.

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