Преобразование байта [] двоичной фиксированной точки в значение с плавающей запятой - PullRequest
2 голосов
/ 05 января 2011

Я читаю некоторые данные через сокет.Интегральные типы данных не представляют проблем, методы System.BitConverter правильно обрабатывают преобразование.(Так что, я думаю, нет проблем с Endian, о которых стоит беспокоиться?)

Однако BitConverter.ToDouble не работает с частями данных с плавающей запятой ... спецификация источника является немного низким уровнем дляя, но говорю о двоичном представлении с фиксированной точкой с положительным смещением байта в более значимом направлении и отрицательным смещением байта в менее значимом направлении.

Большая часть исследований, которые я провел, была направлена ​​на C ++ илиполная библиотека с фиксированной запятой, обрабатывающая синусы и косинусы, что кажется излишним для этой проблемы.Может ли кто-нибудь помочь мне с функцией C # для получения числа с плавающей запятой из 8 байтов массива байтов с, скажем, смещением -3 байта?

Более подробная информация о формате по запросу:

подписано численное значение данных с фиксированной точкой должно быть представлено в двоичном дополнительном коде, комплемент notation.For данных с фиксированной точкой, значение каждого параметра данных должно быть определено по отношению к опорному байта.Эталонный байт определяет восьмибитное поле с единицей измерения в позиции LSB.Значение младшего разряда эталонного байта равно ОДНО.Байты сдвига должны быть определены целым числом, указывающего положение младшего байта элемента данных относительно опорного байта.MSB элемента данных представляет знаковый бит.Битовые позиции между MSB абсолютного значения параметра и MSB старшего байта должны быть равны значению знакового бита.

Данные с плавающей запятой должны представляться в виде двоичного числа с плавающей запятой в соответствии сIEEE ANSI / IEEE Std 754-2008.(Это предложение из другого раздела, который может быть красной сельдью).

Ответы [ 2 ]

1 голос
/ 07 января 2011

Хорошо, после того, как я задал несколько вопросов местному эксперту по исходному материалу, оказалось, что CodeInChaos был на правильном пути ... если значение составляет 8 байтов со смещением -3 байта, то я могу использовать BitConverter.ToInt64 / 256 ^ 3, если это 4 байта со смещением -1 байт, тогда BitConverter.ToInt32 / 256 выдаст правильный ответ. Я предполагаю, что это означает, что BitConverter.ToXXX, где подписан XXX, достаточно умен, чтобы обрабатывать вычисления с двумя дополнениями!

Спасибо тем, кто пытался помочь, я подумал, что это не может быть слишком сложно, но получить это 256 смещение от формулировки справочного документа было очень странно: -)

0 голосов
/ 05 января 2011

System.BitConverter работает очень медленно, поэтому, если для вас важна производительность, я бы порекомендовал конвертировать байты в int самостоятельно (с помощью логических сдвигов). Также, пожалуйста, укажите, в каком формате плавающие файлы отправляются в вашем протоколе.

...