Forum: PC-Programmierung C# - Vom Uint16 Block CRC Bilden


von ARF (Gast)


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
}

von Peter II (Gast)


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.

von ARF (Gast)


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.

von Peter II (Gast)


Lesenswert?

ARF schrieb:
> CRC32 onthefly Bildung möchte ich vermeiden.

und warum? Wozu alle Daten doppelt im Speicher haben wenn man es nicht 
braucht?

von ARF (Gast)


Lesenswert?

>und warum? Wozu alle Daten doppelt im Speicher haben wenn man es nicht
>braucht?
Aus Code-Ästhetischen Gründen. Die 256 Byte fallen auf einem System mit 
8GB RAM nicht ins Gewicht :/

von Peter II (Gast)


Lesenswert?

ARF schrieb:
> Aus Code-Ästhetischen Gründen. Die 256 Byte fallen auf einem System mit
> 8GB RAM nicht ins Gewicht :/

in diesem forum geht es im technische Probleme, nicht um 
code-beautifing.

von ARF (Gast)


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.

von Arc N. (arc)


Lesenswert?

1
UInt16[] array16 = { 0x1122, 0x2233, 0x3344, 0x4455, 0x5566, 0x6677 };
2
byte[] destArray = new byte[32];
3
4
Buffer.BlockCopy(array16, 2, destArray, 0, 10);
http://msdn.microsoft.com/library/system.buffer.blockcopy.aspx

Bei einzelnen zu konvertierenden Werten BitConverter.GetBytes bzw. 
BitConverter.ToXYZ
http://msdn.microsoft.com/en-us/library/system.bitconverter.aspx

von ARF (Gast)


Lesenswert?

BitConverter kannte ich schon, aber BlockCopy ist genau das was ich 
gesucht habe! Vielen Dank für die konstruktive Antwort!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.