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


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