Преобразовать массив беззнаковых символов (байтов) в беззнаковые короткие в C ++ - PullRequest
0 голосов
/ 25 сентября 2011

У меня есть array^ byteArray, и мне нужно извлечь байты в последовательности Little Endian для создания шортов без знака и целых.Я пробовал каждую комбинацию из следующих, которые я могу придумать, поэтому прошу о помощи.

int x = UInt32(byteArray[i]) + (UInt32)(0x00ff) * UInt32(byteArray[i + 1]);
int x = UInt32(byteArray[i]) + UInt32(0x00ff) * UInt32(byteArray[i + 1]);
int x = byteArray[i] + 0x00ff * byteArray[i + 1];

Проблема в том, что младший байт (при i + 1) имеет значение./ int сообщает младший байт как 0x0b.Старший байт не изменяется.

Я полагаю, что это ошибка знака, но я не могу исправить ее.

Ответы [ 5 ]

3 голосов
/ 25 сентября 2011

Вы используете управляемый код.Endian-ness - это деталь реализации, о которой фреймворк знает:

array<Byte>^ arr = gcnew array<Byte> { 1, 2, 3, 4 };
int value = BitConverter::ToInt16(arr, 1);
System::Diagnostics::Debug::Assert(value == 0x302);

Правильность предположений фреймворка зависит от того, откуда пришли данные.

2 голосов
/ 25 сентября 2011

Правильный способ генерации 16-битного int из двух 8-битных целых чисел - value = static_cast< int16_t >( hibyte ) << 8 | lobyte;

1 голос
/ 25 сентября 2011
int y = byteArray[i] | byteArray[i + 1] << 8;

- это то, что вам нужно использовать.(см. также Преобразование векторак вектору)

0 голосов
/ 25 сентября 2011

Вы должны умножить второй байт на 0x0100 вместо 0x00ff.

Это похоже на десятичную систему, где вы умножаете на десять, а не на девять.

0 голосов
/ 25 сентября 2011

Вы хотите сделать это вместо этого

int x = UInt32(byteArray[i]) | (UInt32(byteArray[i + 1]) << 8);

Ваши множители все портят.

...