Почему 2 байта 105,135 System::BitConverter::ToUInt16() даёт 34665 вместо 27015?

Рейтинг: 0Ответов: 1Опубликовано: 17.05.2023

Пробовал конвертировать онлайн конвертерами 27015 в десятичное, получал 15 байт, добавил 0 в к позиции 0, получил 16. Разделил 16 байт на 2 по 8, получилось

27015 это
01101001 d10=105
10000111 d10=135
а .NetF (ToUInt16) из этого делает не 27015, а 34665
            
cli::array<unsigned char> ^arrBytesCurrentDbg2 = gcnew cli::array<unsigned char>{(char)105, (char)135};     
unsigned short int16DbgCurrent2 = System::BitConverter::ToUInt16(arrBytesCurrentDbg2,0);

введите сюда описание изображения

Ответы

▲ 3

BitConverter использует так называемый host byte order, то есть порядок байт соответствующий архитектуре процессора.

Процессоры архитектур x86, amd64 и arm (то есть все популярные) относятся к остроконечникам (little-endian), что означает что они используют порядок разрядов от младшего к старшему.

Именно поэтому преобразование пары байт [x, y] в число происходит по правилу x + y * 256, а не x * 256 + y как вы подумали. Но вот если запустить ваш код на мейнфрейме от IBM, то он сработает именно так как вы планировали изначально.

Проверить порядок байт платформы можно обращением к полю System::BitConverter::IsLittleEndian.