powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / преобразование из hex в ieee 754 half precision
25 сообщений из 63, страница 2 из 3
преобразование из 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
25 сообщений из 63, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / преобразование из hex в ieee 754 half precision
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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