Помощь      Поиск      Пользователи      BanList


 Страниц (1): [1]   

> Без описания
vilserg
Отправлено: 01 Апреля, 2014 - 11:45:32
Post Id



Пользователь
Newbie


Покинул форум
Сообщений всего: 19
Дата рег-ции: Март 2014  
Откуда: Нижний Новгород





Контроллер Siemens S7-200 через свой родной OPC-сервер PC Access выдаёт 4 байта. Эти 4 байта представляют собой число в формате ieee754. Скриптом в DataRate я собрал 4 байта в одну переменную типа int64, у которого младшие 32 бита представляют собой float-число в формате ieee754, а старшие 32 бита - нули.

само число: BF7F DFC2. Это ieee754 представление числа -0.999508. Как мне получить на экране именно -0.999508, а не 3212828610, которое является простым переводом BF7F DFC2 в десятичную систему??

(Отредактировано автором: 01 Апреля, 2014 - 11:47:56)

 
 Top
vilserg
Отправлено: 03 Апреля, 2014 - 20:08:31
Post Id



Пользователь
Newbie


Покинул форум
Сообщений всего: 19
Дата рег-ции: Март 2014  
Откуда: Нижний Новгород





 vilserg пишет:
Контроллер Siemens S7-200 через свой родной OPC-сервер PC Access выдаёт 4 байта. Эти 4 байта представляют собой число в формате ieee754. Скриптом в DataRate я собрал 4 байта в одну переменную типа int64, у которого младшие 32 бита представляют собой float-число в формате ieee754, а старшие 32 бита - нули.

само число: BF7F DFC2. Это ieee754 представление числа -0.999508. Как мне получить на экране именно -0.999508, а не 3212828610, которое является простым переводом BF7F DFC2 в десятичную систему??


Ну, если никто не хочет, отвечаю себе сам:

byte[] bytes = { 0xC2, 0xDF, 0x7F, 0xBF };
float value = BitConverter.ToSingle(bytes, 0);
 
 Top
Support
Отправлено: 07 Апреля, 2014 - 09:15:28
Post Id



Администратор
Full Member


Покинул форум
Сообщений всего: 206
Дата рег-ции: Сент. 2010  





Здравствуйте!

int _i = unchecked((int)0xBF7FDFC2);

float _singleValue = BitConverter.ToSingle(_bytes, 0);
byte[] _bytes = BitConverter.GetBytes(_i);


Тип System.Single соответствует стандарту IEC 60559:1989 (IEEE 754), описывающему правила двоичной арифметики с плавающей запятой.

Поэтому. чтобы преобразовать число 0xBF7FDFC2 не в целочисленное представление, каковым у Вас оно является, а в вещественное, надо сделать преобразование:

1) если переменная _i типа System.Int32 и надо представить ее в System.Single.

byte[] _bytes = BitConverter.GetBytes(_i); // 4 байта

2) если переменная _i типа System.Int64 и надо представить ее в System.Double.

long _i = 0xBF7FDFC2;

double _doubleValue = (double)BitConverter.ToSingle(_bytes, 0);

(Отредактировано автором: 07 Апреля, 2014 - 09:16:33)
Тема закрыта!

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« SCADA/HMI DataRate »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by ExBB FM 1.0 Final