powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / преобразование из hex в ieee 754 half precision
63 сообщений из 63, показаны все 3 страниц
преобразование из hex в ieee 754 half precision
    #38729719
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть данные в хексе вида
D0 58 3E
необходимо перевести это ieee 754 half precision
есть такой конвертер но он одинарной точности (32 бита, а мне именно 16 бит надо)
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38729743
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerD0 58 3E
Это 3 байта получается и значит это не half precision число.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38729758
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
последний байт 00
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38729951
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38729955
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не математик а программист
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38729962
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerя не математик а программистЯ тебя уже спрашивал нахрена тебе число с плавающей точкой, твой предыдущий пост, не совсем понятен, что ты вообще хочешь делать и нужен весь текст работы с СОМ портом и откуда выдержки из документации (к какому прибору).
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38729967
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerя не математик а программист

ну ясно.
Про английский тоже - "я не филолог, а программист"?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38729972
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer, если тебе нужно преобразовать число в формате IEEE 754 в IEEE 754 half precision, то тебе придется делать это самостоятельно т.к. в .NET нет двухбайтового типа с плавающей точкой. Не забывай что это будет преобразование с потерей точности. Открываешь википедию (ссылку Pallaris привел), изучаешь формат и пишешь преобразование. Отмазки "я не математик" оставь детям.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38730143
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фак а вот конвертер который я показал, он не умеет такое преобразование делать?
потому что в доке к железяке такое написано
Формат значений Hmax, Qmax, Umax, Vmax, H, Q, U, V - «укороченный» вариант формата стандарта IEEE-754 (двухбайтная мантисса).
то бишь если исходя из вики, халф пресижин - это 5 бит целой части, и 10 мантиссы. а в конвертере 8 бит целой части и все остальное мантиса
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38730205
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пролистай вики до конца, там ссылки на примеры (в т.ч. с#)
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38730375
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там толи библиотека, толи модуль. в общем дольше разбираться
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731130
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто пользовался этой библиотекой ?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731290
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем задача свелась в следующему - как сложить несколько шестнадцатеричных чисел (1f + 3e + a7)
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731298
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerв общем задача свелась в следующему - как сложить несколько шестнадцатеричных чисел (1f + 3e + a7)
а при чём здесь плавающая точка?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731305
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилdes1roerв общем задача свелась в следующему - как сложить несколько шестнадцатеричных чисел (1f + 3e + a7)
а при чём здесь плавающая точка?У ТС пытались выяснить суть задачи, но..
А числа сложи на кулькуляторе виндоВс.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731307
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропила при чём здесь плавающая точка?

Кармаку такая оптимизация работы с плавающей точкой и не снилась
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731326
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем все глухо с этими форматами. не действительно, как сложить два хекс числа на шарпе?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731333
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerв общем все глухо с этими форматами. не действительно, как сложить два хекс числа на шарпе?может конвертировать? не. У всех числовых типов есть Parse, см MSDN
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731338
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransaможет конвертировать?

Он и так массив байт получает

А складывать надо так
Код: c#
1.
int hex3 = hex1 + hex2;
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731343
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да он уже запутал. ну да сложи однако байты-то.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731507
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransaсложи
топикстартер - программист, а не математик
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731616
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer, в спеке к прибору что сказано? Что передаёт протокол не с точки зрения формата, а с точки зрения смысловой нагрузки?
В итоге что должно получиться на выходе после преобразования значений?

Учтите, что при сложении шестнадцатеричных переменных без преобразования у вас может получиться результат отличный от того, что Вы ожидаете.

Возьмите правила преобразования, листочек, карандашик и напишите порядок преобразования значений из одной системы счисления в другую стремясь получить желаемый результат, тогда, возможно, у Вас появится алгоритм преобразования и Вы сможете его реализовать в программе.
Да, математика здесь понадобится, потому что без неё в нашем деле (нелёгком программистском) никуда.

PS. Вы же, надеюсь, не быдлокодер ...а пока просто постигаете некоторые аспекты практического применения математики в программировании
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731628
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsovdes1roer, в спеке к прибору что сказано? Что передаёт протокол не с точки зрения формата, а с точки зрения смысловой нагрузки?
В итоге что должно получиться на выходе после преобразования значений?

Учтите, что при сложении шестнадцатеричных переменных без преобразования у вас может получиться результат отличный от того, что Вы ожидаете.

Возьмите правила преобразования, листочек, карандашик и напишите порядок преобразования значений из одной системы счисления в другую стремясь получить желаемый результат, тогда, возможно, у Вас появится алгоритм преобразования и Вы сможете его реализовать в программе.
Да, математика здесь понадобится, потому что без неё в нашем деле (нелёгком программистском) никуда.

PS. Вы же, надеюсь, не быдлокодер ...а пока просто постигаете некоторые аспекты практического применения математики в программированииМы понять не можем что он хочет, а ТС молчит как партизан и странные вопросы задает.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38731875
DS53
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
быстрое решение я там предложил.
я только не понял в каком формате числа? если в строках, то решение я привел.

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1112982&msg=16507983

давайте детали)
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732129
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerв общем задача свелась в следующему - как сложить несколько шестнадцатеричных чисел (1f + 3e + a7)
Ежели использовать ту библиотеку http://sourceforge.net/p/csharp-half
То можно и так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
// Процесс получения данных, а также переменных типа byte пропущен.

// таким образом в итоге у нас есть три переменных типа byte : b1, b2 и b3
// Ну а далее примерно так:
...

Half res = ((Half)b1 + (Half)b2) + (Half)b3;
...
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732311
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
писать начали после того как ушел. В общем сделал так - получаю 3 хекса с прибора (4 зануляем). С помощью ToSingle привожу это к формату IEEE 754 (32 b). точность выше - не смертельно. после этого необходимо было обсчитать сумму хексов с контрольной суммой. То есть сложить хексы. Ради этого перевел хексы в инт, сложил, затем перевел обратно. И теперь могу сравнить сумму и контрольную сумму. правда пришлось и суммы хексов откусить первый символ (но это так, нюансы). Про библиотеку халф слышал, даже пытался пользоваться. Только вот незадача - данные какие-то больно левые получаются. Может кто знает как правильно ей пользоваться, напишите пожалуйста, с ней попробую. Только описание максимально понятное. Задача следующая - 4 хекса привести к виду десятичного числа.
про быдлокодера - все чаще слышу, что скорость разработки оправдывает не самый красивый код. на самом деле я далеко не гуру, но пытаюсь профессионально расти каждый день и писать как можно более эффективно. Готов обучаться у мастеров.
ну вот все
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732313
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дс53, а зачем такой длинный код?
Код: c#
1.
Convert.ToInt16(data[0]);


data[0] - байтовое представление хекса.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732317
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

Вы смысловую нагрузку получаемых данных опишете или это секрет за семью печатями?
По поводу использования библиотеки Half - я же привёл пример, чем он не угодил?
Кроме того библиотека имеет открытый код - вполне себе даже нормально документированный, чего не хватает-то?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732321
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer...
про быдлокодера - все чаще слышу, что скорость разработки оправдывает не самый красивый код...Не общайтесь с такими людьми, бегите от них...
Скорость разработки зависит только от наличия денег и трудовых ресурсов, а не от красивости кода. Код должен быть не красивым, а решать конкретную задачу и при этом он должен быть на достаточном уровне оптимален и легко сопровождаем, а это само по себе означает, что код не должен быть говнокодом...

PS. Кстати, пример нормального кода - как раз и есть в библиотеке Half - поизучайте, коль скоро Вы только учитесь.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732447
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer
Код: c#
1.
Convert.ToInt16(data[0]);


data[0] - байтовое представление хекса.
Если datа имеет тип byte[], то data[0] не "байтовое представление хекса", а просто байт. То есть число. И с ним можно делать сложение без всяких преобразований как уже говорил Pallaris 16505688 . Если все же необходимо пребразование, то можно короче записать:
Код: c#
1.
(short)data[0]



Подумай также над таким примером:
Код: c#
1.
2.
byte b1 = 74, b2 = 0x4A;
int sum = b1 + b2;


Отличаются ли в памяти переменные b1 и и2?

des1roerС помощью ToSingle привожу это к формату IEEE 754 (32 b).
Покажи как именно ты это делаешь.

des1roerРади этого перевел хексы в инт, сложил, затем перевел обратно.

des1roerИ теперь могу сравнить сумму и контрольную сумму. правда пришлось и суммы хексов откусить первый символ (но это так, нюансы)
Это не нюансы. Если у суммы требуется отрезать символ(!), то ты делаешь что-то не то.

des1roerПро библиотеку халф слышал, даже пытался пользоваться. Только вот незадача - данные какие-то больно левые получаются. Может кто знает как правильно ей пользоваться, напишите пожалуйста, с ней попробую. Только описание максимально понятное.
Объясни структуру и смысл данных которые ты получаешь. Иначе толку от примеров будет мало.

des1roerЗадача следующая - 4 хекса привести к виду десятичного числа.
Это зависит от того что эти 4 байта из себя представляют и в каком порядке они идут (от младшего к старшему или наоборот). Вероятно тебе нужен класс BitConverter .

des1roerвсе чаще слышу, что скорость разработки оправдывает не самый красивый код
Не оправдывает.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732572
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
млин из связки F0-6D-3E по своему tosingle получаю 0,2323608 , что похоже на истину, а вот метод Half actual = Half.ToHalf(b, 0);
дает -8192 что явно не правильно
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732585
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
 string hex2 = BitConverter.ToSingle(b, 0).ToString();
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732595
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что обрезаю символ - так это нормально. контрольная сумма передается 2 последних символа, а при сложении 6 знаков получается 3х значное число
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732634
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerиз связки F0-6D-3E по своему tosingle получаю 0,2323608 , что похоже на истину, а вот метод Half actual = Half.ToHalf(b, 0); дает -8192 что явно не правильно
half занимает два байта, single 4 байта. Само собой результаты будут разными. Это значит что у тебя не half precision число и тип Half тебе не нужен.

des1roer
Код: c#
1.
string hex2 = BitConverter.ToSingle(b, 0).ToString();


В чем смысл преобразования числа в строку?

des1roerчто обрезаю символ - так это нормально. контрольная сумма передается 2 последних символа, а при сложении 6 знаков получается 3х значное число
Твоя терминология ставит меня в тупик. Число состоит не символов, а из цифр и поэтому неоткуда отрезать символы. Тебе нужно брать число по модулю 256 (оператор %), а не обрезать символы.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732734
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
Вы партизан вообще...
Какую смысловую нагрузку несут получаемые данные?
Что Вы получаете от устройства?
Что написано в спецификации протокола?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38732745
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsovdes1roer,
Вы партизан вообще...
Какую смысловую нагрузку несут получаемые данные?
Что Вы получаете от устройства?
Что написано в спецификации протокола?Это секрет.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38733801
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что я получаю - так это скорость слива воды. но какким обрпразом это поможет. про резку символов - я получаю предположим 3fe а контрольная сумма (идет 7 знаком) fe . то есть нуно резать первый символ и сравнивать. про сингл и халф - в онлайн конверетере получается как если бы я переводил в сингл. да это 32 бит число, а надо 16 бит. но если использовать халф то вообще отстой. нет что ли людей кто раюотал с этой библиотекой?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38733829
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerчто я получаю - так это скорость слива воды. но какким обрпразом это поможет.

Никак не поможет, поможет вот что:
1. Записать показания на экране прибора на листочек.
2. Опросить прибор по порту и рядом на листочек выписать последовательность байт, которая должна соответствовать числу из п.1.
3. Долго и вдумчиво читать документацию производителя прибора по формату кодирования числа.
4. Долго и вдумчиво читать гугл по формату кодирования числа.
5. Написать метод по переводу последовательности байт в double.
6. Убедиться, что метод выдает число из п.1 по последовательности из п.2.
7. Сделать еще 5 контрольных сравнений на разных числах
8. Если нифига не получилось - звонить в поддержку тем. кто поставляет прибор
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38733858
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerнет что ли людей кто раюотал с этой библиотекой?

Бегло пробежавшись, кажысь обнаружил метод под твой случай
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
/// <summary>
        /// Returns a half-precision floating point number converted from two bytes
        /// at a specified position in a byte array.
        /// </summary>
        /// <param name="value">An array of bytes.</param>
        /// <param name="startIndex">The starting position within value.</param>
        /// <returns>A half-precision floating point number formed by two bytes beginning at startIndex.</returns>
        /// <exception cref="System.ArgumentException">
        /// startIndex is greater than or equal to the length of value minus 1, and is
        /// less than or equal to the length of value minus 1.
        /// </exception>
        /// <exception cref="System.ArgumentNullException">value is null.</exception>
        /// <exception cref="System.ArgumentOutOfRangeException">startIndex is less than zero or greater than the length of value minus 1.</exception>
        public static Half ToHalf(byte[] value, int startIndex)
        {
            return Half.ToHalf((ushort)BitConverter.ToInt16(value, startIndex));
        }
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38733866
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из связки F0-6D-3E по своему tosingle получаю 0,2323608 , что похоже на истину, а вот метод Half actual = Half.ToHalf(b, 0); дает -8192 что явно не правильно
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38733885
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerиз связки F0-6D-3E

Это 24 бита, откуда лишние 8?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38733891
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
Half h_ = Half.ToHalf(new byte[] { 0x6D,0x3E }, 0);
Console.WriteLine(h_.ToString());



1.606445
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734195
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerя получаю предположим 3fe а контрольная сумма (идет 7 знаком) fe . то есть нуно резать первый символ и сравнивать.
3FE это два байта - Ox03 и 0xFE зачем что-то резать, если твоя контрольная сумма (FE) уже хранится отдельным байтом? Похоже ты путаешь символ с байтом. Говори правильно, если хочешь чтобы тебя поняли.

Нашел твое сообщение с примером пакета 16497831 . Теперь тебе надо поступить как сказал Pallaris. Опиши предназначение каждого байта в своем пакете.

№1 №2 №3 №4 №5 №6 №7D0 58 3E 6C 0C 3F 1D??????Контрольная сумма
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734267
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer, в дополнение к тому, что сказал bazile, также нужен алгоритм получения контрольной суммы, т.е. МАТЕМАТИКА того как на основании D0, 58, 3E, 6C, 0C, 3F получить 1D.

Также во вложении пример работы с библиотекой Half.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734280
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsovв дополнение к тому, что сказал bazile, также нужен алгоритм получения контрольной суммы, т.е. МАТЕМАТИКА того как на основании D0, 58, 3E, 6C, 0C, 3F получить 1D.
С этим уже разобрались. Младший байт суммы
Код: c#
1.
2.
// LINQPad пример
((0xD0+0x58+0x3E+0x6C+0x0C+0x3F) % 256).ToString("X2").Dump(); // => 1D
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734500
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так объясните мне пожалуйста. а вот халф пресижин - это два байта? просто как сказал мужик с работы, все таки вычисления идут по 4 байтам. просто последний за ноль берем
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734502
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и как я понимаю
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
         byte[] arr = new byte[] { 0xF0, 0x6D, 0x3E , 0x00};

            Console.WriteLine(String.Format("Half res =((Half)0xF0 = {0:.000000}", (Half)arr[0]));
            Console.WriteLine(String.Format("Half res =((Half)0x6D = {0:.000000}", (Half)arr[1]));
            Console.WriteLine(String.Format("Half res =((Half)0x3E = {0:.000000}", (Half)arr[2]));

            Half res = ((Half)arr[0] + (Half)arr[1]) + (Half)arr[2]  + (Half)arr[3];
            Console.WriteLine(String.Format("Half res =((Half)0xF0+(Half)0x6D)+(Half)0x3E+(Half)0x00 = {0:f}", res));
            res = Half.ToHalf(arr, 0);
            Console.WriteLine(String.Format("res = Half.ToHalf([ 0xF0, 0x6D ], 0) = {0:f}", res));
            res = Half.ToHalf(arr, 1);
            Console.WriteLine(String.Format("res = Half.ToHalf([ 0x6D, 0x3E ], 0) = {0:.000000}", res));
            Console.ReadLine();


просто переводит число в десятичную систему счисления
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734505
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerтак объясните мне пожалуйста. а вот халф пресижин - это два байта?
Два. О чем я тебе уже несколько раз было сказано.

des1roerи как я понимаю ... просто переводит число в десятичную систему счисления
Нет. Этот пример показывает что получится если трактовать один байт или два как тип Half. Тебя похоже вводит в заблуждение, что элементы массива инициализируются hex литералами. Их можно заменить на значение в десятичной форме и результат не изменится.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734508
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин. может мне тогда и не халф пресижин нужен а простое преобразование на 32 бита
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734509
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и тогда этот конвертер правильно решает. и тусингл соответственно тоже
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734511
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer, никто кроме тебя не знает что там нужно пока ты не расскажешь нам формат данных своего пакета. Заполни таблицу из сообщения 16520312
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734514
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D0 58 3E 6C 0C 3F 1D 3 байта - текущее значение слива воды 3 байта - значение уровня воды в баке контрольная сумма
D0 + 58 + 3E + 6C+ 0C+ 3F = 21D
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734515
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,
Вы неправильно поняли.
bazile Вам ответил совершенно верно.

Попробуйте запустить и провести анализ вот этого кода:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HalfTest
{
    class Program
    {
        static void Main(string[] args)
        {

            byte[] arr = new byte[] {240, 109, 62, 0 };

            Console.WriteLine(String.Format("Half res =((Half)0xF0 = {0:.000000}", (Half)arr[0]));
            Console.WriteLine(String.Format("Half res =((Half)0x6D = {0:.000000}", (Half)arr[1]));
            Console.WriteLine(String.Format("Half res =((Half)0x3E = {0:.000000}", (Half)arr[2]));

            Half res = ((Half)arr[0] + (Half)arr[1]) + (Half)arr[2];
            Console.WriteLine(String.Format("Half res =((Half)0xF0+(Half)0x6D)+(Half)0x3E = {0:f}", res));
            res = Half.ToHalf(arr, 0);
            Console.WriteLine(String.Format("res = Half.ToHalf([ 0xF0, 0x6D ], 0) = {0:f}", res));
            res = Half.ToHalf(arr, 1);
            Console.WriteLine(String.Format("res = Half.ToHalf([ 0x6D, 0x3E ], 0) = {0:.000000}", res));
            
            Console.WriteLine(String.Format("BitConverter.ToSingle(arr,0) = {0}", BitConverter.ToSingle(arr,0)));

            Console.ReadLine();

        }
    }
}
Здесь я заменил шестнадцатеричные литералы десятичными. Суть от этого не меняется...



а потом вот этого:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HalfTest
{
    class Program
    {
        static void Main(string[] args)
        {

            byte[] arr = new byte[] {0x00, 0xF0, 0x6D, 0x3E };

            Console.WriteLine(String.Format("Half res =((Half)0xF0 = {0:.000000}", (Half)arr[0]));
            Console.WriteLine(String.Format("Half res =((Half)0x6D = {0:.000000}", (Half)arr[1]));
            Console.WriteLine(String.Format("Half res =((Half)0x3E = {0:.000000}", (Half)arr[2]));

            Half res = ((Half)arr[0] + (Half)arr[1]) + (Half)arr[2];
            Console.WriteLine(String.Format("Half res =((Half)0xF0+(Half)0x6D)+(Half)0x3E = {0:f}", res));
            res = Half.ToHalf(arr, 0);
            Console.WriteLine(String.Format("res = Half.ToHalf([ 0xF0, 0x6D ], 0) = {0:f}", res));
            res = Half.ToHalf(arr, 1);
            Console.WriteLine(String.Format("res = Half.ToHalf([ 0x6D, 0x3E ], 0) = {0:.000000}", res));
            
            Console.WriteLine(String.Format("BitConverter.ToSingle(arr,0) = {0}", BitConverter.ToSingle(arr,0)));

            Console.ReadLine();

        }
    }
}
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734519
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerD0 58 3E 6C 0C 3F 1D 3 байта - текущее значение слива воды 3 байта - значение уровня воды в баке контрольная сумма
Ок. Теперь надо разбраться какой формат у значений слива и уровня. Что документация говорит на этот счет?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734524
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3.2.Формат значений Hmax, Qmax, Umax, Vmax, H, Q, U, V - «укороченный» вариант формата стандарта IEEE-754 (двухбайтная мантисса).
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734727
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

Программное обеспечение для ультразвуковых расходомеров и уровнемеров

В одном из докУментов написано:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
ПРИМЕР:
Запрос текущих значений: AA 02
ответ: 9B 61 B9 3F FE C5 AF 42 2D 04 00 00 02 4E 00 00 00 00 6B B9

значение скорости занимает с 1 по 4 байты: 9B 61 B9 3F
поскольку многобайтные коды передаются младшим байтом вперед, то переводим ответ в нормальную последовательность: 3F B9 61 9B
в двоичном виде: 0011 1111  1011 1001  0110 0001  1001 1011
вычисляем мантиссу:                011 1001  0110 0001  1001 1011  / 1111111 11111111 11111111 = 0,448
показатель степени: 01111111  - 1111111 = 0
скорость: 2 ^ 0 * (1+0,448) = 1,45 [м/сек]
поскольку первый бит числа нулевой (байт 3F), то скорость положительная.

значение расхода занимает с 5 по 8 байты: FE C5 AF 42
поскольку многобайтные коды передаются младшим байтом вперед, то переводим ответ в нормальную последовательность: 42 AF C5 FE
в двоичном виде: 0100 0010  1010 1111  1100 0101  1111 1110
вычисляем мантиссу: 010 1111  1100 0101  1111 1110 / 1111111 11111111 11111111 = 0,373
показатель степени: 10000101 - 1111111 = 6
расход: 2 ^ 6 * (1 + 0,373) = 87,9 [куб.м/ч]
поскольку первый бит числа нулевой (байт 42), то расход положительный.

значение счетчика объема занимает с 9 по 12 байты: 2D 04 00 00 и множитель в 13 байте: 02
поскольку многобайтные коды передаются младшим байтом вперед, то переводим ответ в нормальную последовательность: 00 00 04 2D
в десятичном виде: 1069
множитель: 10 ^ (02 - 3) = 0,1
объем: 1069 * 0,1 = 106,9 [куб.м]


значение счетчика наработки занимает с 14 по17 байты: 4E 00 00 00
поскольку многобайтные коды передаются младшим байтом вперед, то переводим ответ в нормальную последовательность: 00 00 00 4E
в десятичном виде 78 [мин], или 1 час 18 минут.

код неисправности находится в 18 байте: 00, что говорит о исправности прибора. Расшифровка кодов неисправности приведена в руководстве по эксплуатации.
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734758
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

Исходя из предложенной методики, проверьте результат без перемены байт местами:
Код: c#
1.
2.
byte[] arr = new byte[] { 0x9B, 0x61, 0xB9, 0x3F };
Console.WriteLine(String.Format("BitConverter.ToSingle(arr,0) = {0}", BitConverter.ToSingle(arr,0)));


Код: plaintext
BitConverter.ToSingle(arr,0) = 1.448291
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734766
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
baziledes1roerD0 58 3E 6C 0C 3F 1D 3 байта - текущее значение слива воды 3 байта - значение уровня воды в баке контрольная сумма
Ок. Теперь надо разбраться какой формат у значений слива и уровня. Что документация говорит на этот счет?
Уровень воды в баке:
Код: c#
1.
2.
 byte[] arr = new byte[] { 0x00,  0x6C, 0x0C, 0x3F};
Console.WriteLine(String.Format("BitConverter.ToSingle(arr,0) = {0}", BitConverter.ToSingle(arr,0)));


BitConverter.ToSingle(arr,0) = 0.5485229 м3
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38734774
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и текущее значение слива воды

Код: c#
1.
2.
3.
            byte[] arr = new byte[] { 0x00, 0xD0, 0x58, 0x3E };
           
            Console.WriteLine(String.Format("BitConverter.ToSingle(arr,0) = {0}", BitConverter.ToSingle(arr,0)));


BitConverter.ToSingle(arr,0) = 0.211731 м3
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38737006
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
string all = BitConverter.ToString(data);



ну я так и сделал
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38737008
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer
Код: c#
1.
string all = BitConverter.ToString(data);



ну я так и сделалДля чего?
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38737014
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovНу и текущее значение слива воды

Код: c#
1.
2.
3.
            byte[] arr = new byte[] { 0x00, 0xD0, 0x58, 0x3E };
           
            Console.WriteLine(String.Format("BitConverter.ToSingle(arr,0) = {0}", BitConverter.ToSingle(arr,0)));


BitConverter.ToSingle(arr,0) = 0.211731 м3
я так и сделал. просто не надо было с библиотекой халф возиться, она мне видимо не нужна
...
Рейтинг: 0 / 0
преобразование из hex в ieee 754 half precision
    #38737017
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer...
я так и сделал.
Получилось то, что ожидалось?
des1roer...просто не надо было с библиотекой халф возиться, она мне видимо не нужнаОчевидно, что сперва надо читать документацию к прибору и детальное описание протокола, которое, кстати, доступно даже в открытых источниках.

Если всё получилось, рад, что смог чем-то помочь.

Удачи.
...
Рейтинг: 0 / 0
63 сообщений из 63, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / преобразование из hex в ieee 754 half precision
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]