C ++ to .NET: мне нужна помощь с пониманием кода C ++, чтобы преобразовать его в .NET - PullRequest
2 голосов
/ 31 августа 2011

C ++ код:

unsigned short* ui=(unsigned short*)&buf[110];
            CountDev=ui[0];

buf равно byte[], а CountDev равно unsigned int

(BCB6 Compiler x86)

Моя попытка: F #

...CountDev  = System.BitConverter.ToInt32( [| arrayRead.[110]; arrayRead.[111] |] , 0 )

C #

...CountDev  = System.BitConverter.ToInt32( [arrayRead[110]; arrayRead[111]] , 0 )

А если серьезно, я не уверен в этом. Проверьте мою попытку и скажите мне, если я делаю это неправильно, пожалуйста.

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Возможно, вы сможете использовать:

  ... = System.BitConverter.ToUint16(arrayRead, 110);

Но это зависит от порядкового байта (порядка байтов в массиве).
Для этого вам понадобятся спецификации илихороший тестовый пример.

3 голосов
/ 31 августа 2011

Я бы просто сделал это, чтобы просто объединить два байта и поместить его в int:

UInt32 CountDev = (UInt32)arrayRead[111] << 8 | (UInt32)arrayRead[110];

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

int CountDev = (int)arrayRead[111] << 8 | (int)arrayRead[110];

Редактировать

Решение от Henk Holtermans, безусловно, является лучшим выбором, поскольку оно использует порядковый номер текущей машины:

UInt32 CountDev = (UInt32)System.BitConverter.ToUint16(arrayRead, 110);
1 голос
/ 31 августа 2011

Вам нужно использовать System.BitConverter.ToUInt16 вместо System.BitConverter.ToInt32

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...