powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBS: 4 байта -> флоат
4 сообщений из 4, страница 1 из 1
VBS: 4 байта -> флоат
    #34176388
Kamsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется массив из 4 байт (считанные из устройства). Как перевести эти 4 байта в одну переменную формата float (32-бит IEEE 754)?
Задача осложняется тем, что используется VBS, а не VB...
...
Рейтинг: 0 / 0
VBS: 4 байта -> флоат
    #34177978
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тривиально:

1ый (я с начала) бит - знак (1,0)
следующие 8 - экспонента, надо +127 еще прибавить
далее матиса про приципу:
пусть ai - итый ( с начала матисы, i от 1 бит)
m = 1 + a1/2 +a2/4 + a3/8 + a4/2^4...

итого : 2^(127 + exp)*m + знак,

а лучше преобразовать по указателю

вроде бы что-то такое

cInt()
или cFlt()

точно такое с cByte работало, т.е. преобразование из строки в массив байтов, попоробуйте, авось...

аффтопитезь
...
Рейтинг: 0 / 0
VBS: 4 байта -> флоат
    #34178137
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kamsky,
был бы это VB, можно было бы сделать простой LSet. А с VBS придётся действовать по описанию формата в стандарте:
Код: 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.
Function LongToFloat(X)
 Dim S, E, F

 S = -(X <  0 )
 E = (X And &H7F800000) \ &H800000
 F = X And &H7FFFFF
 
 If ( 0  < E) And (E <  255 ) Then
    LongToFloat = (- 1 ) ^ S *  2  ^ (E -  127 ) * ((F Or &H800000) / &H800000)
 ElseIf E =  0  Then
    If F =  0  Then
       If S =  0  Then
          LongToFloat =  0  'плюс ноль
       Else
          LongToFloat = - 0  'минус ноль
       End If
    Else '(E = 0) And (F <> 0)
       LongToFloat = (- 1 ) ^ S *  2  ^ (- 126 ) * (F / &H800000)
    End If
 Else 'E = 255
    If F =  0  Then
       If S =  0  Then
          LongToFloat =  0  'плюс бесконечность
       Else
          LongToFloat = - 0  'минус бесконечность
       End If
    Else '(E = 255) And (F <> 0)
       LongToFloat =  0  'не-число - NaN - Not a Number
    End If
 End If
End Function
Как представлять спецзначения, оптимизировать - придумывай сам.
Для "упаковки" четырёх байт в 32-разрядное слово:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function FourBytesToLong(B0, B1, B2, B3)
 If B3 <=  127  Then
    FourBytesToLong = B3 * &H1000000 + B2 * &H10000 + B1 * &H100& + B0
 Else
    FourBytesToLong = -(( 255  - B3) * &H1000000 + ( 255  - B2) * &H10000 + _
                        ( 255  - B1) * &H100& + ( 255  - B0) +  1 )
 End If
End Function
Для проверки:
Код: plaintext
1.
2.
3.
4.
Sub Test()
 Dim L
 L = LongToFloat(FourBytesToLong(&HDA, &H0F, &H49, &H40)) 'число Пи, по идее
End Sub
...
Рейтинг: 0 / 0
VBS: 4 байта -> флоат
    #34178207
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более правильно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function FourBytesToLong(B0, B1, B2, B3)
 If B3 <=  127  Then
    FourBytesToLong = B3 * &H1000000 + B2 * &H10000 + B1 * &H100& + B0
 Else
    FourBytesToLong = -(( 255  - B3) * &H1000000 + ( 255  - B2) * &H10000 + _
                        ( 255  - B1) * &H100& + ( 255  - B0)) -  1 
 End If
End Function
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBS: 4 байта -> флоат
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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