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