Аватар для Argus19
1433 / 450 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23

Как массив байт поместить в переменную типа Double?

13.08.2024, 12:10. Показов 1059. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как массив байт поместить в переменную типа Doble?
Я получаю от устройства массив из 4 байт. Чтобы присвоить его переменной типа Long нашёл в интернете так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   Private Type FourBytes
      b0 As Byte
      b1 As Byte
      b2 As Byte
      b3 As Byte
    End Type
     
    Private Type DWord
      L As Long
    End Type
     
    Private Sub Form_Load()
      Dim B4 As FourBytes
      Dim DW As DWord
     
      B4.b0 = 0
      B4.b1 = 1
      B4.b2 = 2
      B4.b3 = 3
      LSet DW = B4
      Caption = Hex(DW.L)
    End Sub
Это работает. Остаётся преобразовать в переменную типа Doble. Вот так:
Visual Basic
1
 Caption = CDbl(DW.L)
приводит к получению целого числа. А я получаю от устройства float32, разбитую на 4 байта.
Нашёл в интернете функцию на С++:
C++
1
2
float ieee754(const uint32_t d)
{return *((float *)&(d));}
Как её реализовать на VB?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.08.2024, 12:10
Ответы с готовыми решениями:

Как переменную типа Long записать в массив типа Double?
Доброго дня Уважаемые. Подскажите пожалуйста, как переменную типа Long записать в массив типа Double? Прошу прощения, если неправильно...

Как конвертировать переменную типа Double в переменную типа String?
Как конвертировать переменную типа Double в переменную типа String. И наоборот.

Как использовать функцию, выдающую через переменную типа байт результат, объём которого больше, чем байт?
Есть сканер отпечатков. Для него есть компонент ActiveX. У этого компонента есть функции. Среди них есть две похожих функции для получения...

8
 Аватар для Mikle Quits
779 / 296 / 17
Регистрация: 21.01.2023
Сообщений: 508
13.08.2024, 13:30
Начнём с того, что Double - это 8 байт, а не 4.
Если просто в лоб, то как-то так:
Visual Basic
1
2
3
4
5
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Dest As Any, ByRef Src As Any, ByVal Length As Long)
Dim b(7) As Byte
Dim D As Double
 
CopyMemory D, b(0), 8
3
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
13.08.2024, 14:02
Лучший ответ Сообщение было отмечено Argus19 как решение

Решение

Visual Basic
1
2
3
    Private Type DWord
      L As Single
    End Type
2
 Аватар для Argus19
1433 / 450 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
13.08.2024, 18:45  [ТС]
The trick, спасибо. Всё заработало. Как всегда просто и изящно.
0
 Аватар для Argus19
1433 / 450 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
16.12.2024, 15:37  [ТС]
У меня появилась фантазия запихнуть эту функцию в библиотеку на С++.
Суть: получаю в буфер массив байт, отправляю в функцию ссылку на первый байт нужного фрагмента массива из 4 байт и функция возвращает float_32.
На VB 6.0 у меня прекрасно работает так:
Visual Basic
1
2
3
4
5
6
      B4.b0 = bRead(7)
      B4.b1 = bRead(6)
      B4.b2 = bRead(5)
      B4.b3 = bRead(4)
      LSet DW = B4
    Label4.Caption = Round(CDbl(DW.L), 2)
Что-то никак не соображу, хотя всё перед носом.

Добавлено через 5 часов 14 минут
Спасибо интернету.
Всё работает. Например:
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
float _stdcall ieee754(unsigned char* str)
{
    union {
        float f;
        unsigned char b[4];
    } num_f;
    num_f.b[3] = str[3];
    num_f.b[2] = str[2];
    num_f.b[1] = str[1];
    num_f.b[0] = str[0];
 
    float f = num_f.f;
    return f;
}
int main()
{
    union dataUnion {
        float f;
        unsigned char fBuff[sizeof(float)];
    } myUnion;
 
    std::cin >> myUnion.f;
    for (int i = 0; i < sizeof(float); i++)
    {
        printf("%x\n", (myUnion.fBuff[i]));
    }
 
    d = ieee754(&myUnion.fBuff[0]);
    std::cout << d << "\n";
}
Непонятно, каким образом введённое число помещается в массив, ведь никаких действий не производится.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
16.12.2024, 15:57
C
1
2
3
float _stdcall ieee754(unsigned char* str) {
return *((float*)str);
}
2
16.12.2024, 17:24

Не по теме:

Все-таки он был демон, это как его, который придумал этот язык

0
 Аватар для Argus19
1433 / 450 / 78
Регистрация: 24.09.2017
Сообщений: 2,533
Записей в блоге: 23
16.12.2024, 19:40  [ТС]
The trick, отличный код.
Я не понял, как в приведённом мной коде, введённое с клавиатуры число попадает в массив байт? Я же ничего не делаю.
(строки: 22 - 26).
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
16.12.2024, 20:03
Argus19, читайте что такое union'ы, а вообще этот вопрос к этому разделу не относится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2024, 20:03
Помогаю со студенческими работами здесь

Считать массив байт в переменную типа int в обратном порядке
Есть массив байт: char byData = {0x87, 0xd6, 0x12, 0x00}; Нужно считать его в переменную типа int в обратном порядке, т.е. должно...

Как присвоить текстбоксу переменную типа double
Как присвоить текстбоксу переменную типа double Если писать textBox3-&gt;Text = RES; то вылетает ошибка, что нельзя конвертировать дабл в...

Как правильно выводить переменную типа double на экран?
Помогите, плиз, как правильно выводить переменную типа double на экран ?? У меня выводится какое-то непонятное число 292057083 вместо...

Как привести переменную типа Object к типу Double?
Как привести переменную типа Object к типу Double?

Как ввести свои данные в переменную типа double?
Я это не проходил, но мне это надо, как это сделать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru