Портирование uint с c на c # - PullRequest
0 голосов
/ 04 мая 2018

Я портирую C программу на C#

В программе C у меня есть этот кусок кода

uint32_t *st = (uint32_t*)((uint8_t*)rawptr+4);
uint64_t *d = (uint64_t*)((uint8_t*)rawptr+8);
uint8_t err = st[0] >> 24;
uint8_t type = (st[0] >> 24) & 0x3;
uint32_t nybble = st[0] & 0x0ffffff;

Я пытался преобразовать его в c #

uint[] st = (uint)((byte)rawptr + 4);
ulong d = (ulong)((byte)rawptr + 8);
byte err = st[0] >> 24;
byte type = (st[0] >> 24) & 0x3;
uint nybble = st[0] & 0x0ffffff;

Но в этой ситуации я встречаю CS00029 ОШИБКУ (Cannot convert from uint to uint[])

Я также пытался изменить его на

uint st = (uint)((byte)rawptr + 4);
ulong d = (ulong)((byte)rawptr + 8);
byte err = st[0] >> 24;
byte type = (st[0] >> 24) & 0x3;
uint nybble = st[0] & 0x0ffffff;`

Но в этом случае ошибка CS00021 Cannot apply indexing with [] to an expression of type 'uint'

Не могли бы вы помочь мне решить эту проблему?

Большое спасибо!

1 Ответ

0 голосов
/ 04 мая 2018

Похоже, у вас много работы по рефакторингу.

Вы можете использовать такие классы, как BinaryReader или BitConverter.

Предполагая, что rawptr может быть преобразован или считан как байтовый массив: (я также переименую его в rawBytes)

  byte[] rawBytes = new byte[DATA_LENGTH];

  UInt32 bitmaskedWord = BitConverter.ToUInt32(rawBytes, 0);
  UInt32 st = BitConverter.ToUInt32(rawBytes, 4);
  UInt32 d = BitConverter.ToUInt32(rawBytes, 8);

  bool err = (bitmaskedWord & 0xFF) != 0;
  UInt32 type = bitmaskedWord & 0x3;
  UInt32 nybble = bitmaskedWord & 0x0ffffff;

Поток байтов может быть лучшим решением, особенно если в rawptr имеется неопределенный объем данных. В этом случае используйте BinaryReader.

...