Всем привет!
Подскажите, как правильно преобразовать 4 байта (массив) в число типа Single?
Через запись в файл и чтение как то смешно, хотя получается =)
Type UDT_FourBytes
b(3) As Byte
End Type
Type UDT_Single
s As Single
End Type
Dim ub as UDT_FourBytes, us as UDT_Single
ub.b(0) = 1
ub.b(1) = 2
ub.b(2) = 3
ub.b(3) = 4
LSet us = ub
debug.print us.s
timsoft писал(а):Спасибо. Пока не понятно =)
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Sub Form_Load()
Dim i As Single
Dim S As String
S = "test"
CopyMemory i, ByVal S, 4
MsgBox i
End Sub
Хакер писал(а):
- Через альтернативно-объявленную VarPtr
iGrok писал(а):Как вариант..
- Код: Выделить всё
Type UDT_FourBytes
b(3) As Byte
End Type
Type UDT_Single
s As Single
End Type
Dim ub as UDT_FourBytes, us as UDT_Single
ub.b(0) = 1
ub.b(1) = 2
ub.b(2) = 3
ub.b(3) = 4
LSet us = ub
debug.print us.s
jangle писал(а):timsoft писал(а):Спасибо. Пока не понятно =)
Примерно так
timsoft писал(а):
тут если в массиве есть 0, то String обрубается...
Penumbra писал(а):товарищи! а как преобразовать 4 байта в знаковое число с плавающей точкой
например
D6 DB C9 84 = +50,46
54 35 CB 84 = +50,8
Penumbra писал(а):я их неполучил, я их в задании с примера списал
D6 DB C9 84 - байтовый массив читать с парава на лево
написано что это IEEE-стандарт представления чисел с плавающей точкой
Function long2IEEEfloat(l As Long) As Single
Dim s As Long, e As Long, m As Long
s = Sgn(l): If s = 0 Then s = 1
m = l And &H7FFFFF
e = (((l And &H7FFFFFFF) \ &H7FFFFF) And &HFF) - 127
long2IEEEfloat = s * (1 + m / &H7FFFFF) * 2 ^ e
End Function
'?long2IEEEfloat(&hC2ED4000)
'-118,625
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50