Контроллер 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 в десятичную систему??
1. vilserg - 01 Апреля, 2014 - 11:45:32 - перейти к сообщению
2. vilserg - 03 Апреля, 2014 - 20:08:31 - перейти к сообщению
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 в десятичную систему??
само число: BF7F DFC2. Это ieee754 представление числа -0.999508. Как мне получить на экране именно -0.999508, а не 3212828610, которое является простым переводом BF7F DFC2 в десятичную систему??
Ну, если никто не хочет, отвечаю себе сам:
byte[] bytes = { 0xC2, 0xDF, 0x7F, 0xBF };
float value = BitConverter.ToSingle(bytes, 0);
3. Support - 07 Апреля, 2014 - 09:15:28 - перейти к сообщению
Здравствуйте!
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);
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);