2011-01-05 6 views
2

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

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

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

Более подробная информация о формате в соответствии с просьбой:

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

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

+1

Этот вопрос невозможно ответить на данный момент. Чтобы преобразовать два разных формата, вам нужны точные определения этих форматов. Вы не только не дали определения для формата с фиксированной точкой (плавающая точка определена IEE754), ваши вопросы подсказывают, что на самом деле у вас нет такого определения. Вам нужно получить эту информацию. –

+0

Если это простой номер фиксированной точки, вы можете проанализировать его как int, а затем умножить его на определенную константу. Например, при 2^-16, если фиксированная точка равна 16 дробным битам. – CodesInChaos

+0

@CodeInChaos Это правда, но OP не знает формат, даже после его обновления. –

ответ

1

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

Благодаря тем, кто пытался помочь, я думал, что это не может быть слишком сложным, но получить, что 256 смещена от НТД редакции было очень запутанным :-)

+0

Если вы ответите на свои вопросы, это нормально, тогда также отметьте его как «ответ», иначе он будет продолжать появляться в «неотвеченных» запросах. –

0

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

+0

С каких пор битконвертер медленный? У вас есть статистика по этому поводу? –

+0

Я обнаружил, что несколько лет назад в реализации алгоритма симметричного шифрования. Сейчас я не могу показать цифры, могу только сказать, что разница была очень значительной. –

Смежные вопросы