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

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

13.08.2024, 12:10. Показов 1008. Ответов 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
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
13.08.2024, 14:02
Лучший ответ Сообщение было отмечено Argus19 как решение

Решение

Visual Basic
1
2
3
    Private Type DWord
      L As Single
    End Type
2
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
13.08.2024, 18:45  [ТС]
The trick, спасибо. Всё заработало. Как всегда просто и изящно.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
16.12.2024, 19:40  [ТС]
The trick, отличный код.
Я не понял, как в приведённом мной коде, введённое с клавиатуры число попадает в массив байт? Я же ничего не делаю.
(строки: 22 - 26).
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru