Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Argus19
1431 / 448 / 78
Регистрация: 24.09.2017
Сообщений: 2,532
Записей в блоге: 23

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

13.08.2024, 12:10. Показов 1038. Ответов 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
Сообщений: 492
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
1431 / 448 / 78
Регистрация: 24.09.2017
Сообщений: 2,532
Записей в блоге: 23
13.08.2024, 18:45  [ТС]
The trick, спасибо. Всё заработало. Как всегда просто и изящно.
0
 Аватар для Argus19
1431 / 448 / 78
Регистрация: 24.09.2017
Сообщений: 2,532
Записей в блоге: 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
1431 / 448 / 78
Регистрация: 24.09.2017
Сообщений: 2,532
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru