Проблемы с преобразованием в определенный формат C#

Это может быть немного странным вопросом, однако я создал программу, которая взаимодействует с другой программой (другая программа была создана не мной). Мне нужно отправить "расстояния" в другую программу, однако у меня возникают проблемы с пониманием того, как программа интерпретирует эти расстояния.

Я перехватил устройство, которое успешно отправляет расстояния в программу. Ниже приведен пример отправляемого расстояния. Я думаю, что программа читает на расстоянии, как ushort. Надеюсь, мне будет не хватать простой вещи, так как я не могу перевести мои расстояния в один и тот же формат.

Например: отправляемое расстояние равно 74. Отправлено байтов [0, 74]. Это как ushort 18944.

Мое первоначальное мышление заключалось в том, что расстояние преобразуется в короткий срок. Затем байты ushort отправляются в программу. Однако, похоже, это не так.

1 ответ

Решение

Именно Endianness является причиной ошибки:

  • отправитель: 74 (int16) == [0, 74] - сначала старший, затем младший байты
  • приемник: 74 (int16) == [74, 0] - сначала младшие, затем старшие байты

И именно поэтому получатель получает

   0 + 74 * 256 == 18944

Попробуйте проверить Little / Big Endian (т.е. порядок байтов):

   byte[] data = new byte[] { 0, 74 };

   // If the WorkStation uses Little Endian order, we have to reverse the buffer
   ushort dist = BitConverter.ToUInt16(BitConverter.IsLittleEndian 
       ? data.Reverse().ToArray() 
       : data, 
     0);

   // 74
   Console.WriteLine(dist);
Другие вопросы по тегам