Преобразовать 4 байта в Single

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Преобразовать 4 байта в Single

Сообщение timsoft » 28.02.2009 (Сб) 13:46

Всем привет!
Подскажите, как правильно преобразовать 4 байта (массив) в число типа Single?
Через запись в файл и чтение как то смешно, хотя получается =)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Преобразовать 4 байта в Single

Сообщение Хакер » 28.02.2009 (Сб) 13:57

  • Через GetMem4
  • Через LSet
  • Через альтернативно-объявленную VarPtr
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Re: Преобразовать 4 байта в Single

Сообщение timsoft » 28.02.2009 (Сб) 14:30

Спасибо. Пока не понятно =)
tim@ Изображение

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Преобразовать 4 байта в Single

Сообщение iGrok » 28.02.2009 (Сб) 14:40

Как вариант..
Код: Выделить всё
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
label:
cli
jmp label

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Преобразовать 4 байта в Single

Сообщение jangle » 28.02.2009 (Сб) 14:40

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Преобразовать 4 байта в Single

Сообщение tyomitch » 28.02.2009 (Сб) 14:47

Хакер писал(а):
  • Через альтернативно-объявленную VarPtr

Успешной тебе передачи массива байтов ByVal.
Изображение

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Re: Преобразовать 4 байта в Single

Сообщение timsoft » 28.02.2009 (Сб) 15:09

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


Спасибо огромное, этот вариант -- то что надо!
tim@ Изображение

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Re: Преобразовать 4 байта в Single

Сообщение timsoft » 28.02.2009 (Сб) 15:11

jangle писал(а):
timsoft писал(а):Спасибо. Пока не понятно =)

Примерно так


тут если в массиве есть 0, то String обрубается...
tim@ Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Преобразовать 4 байта в Single

Сообщение jangle » 28.02.2009 (Сб) 15:15

timsoft писал(а):
тут если в массиве есть 0, то String обрубается...


С какой стати? Ты думаешь в VB строки хранятся в ASCIIZ виде?

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Преобразовать 4 байта в Single

Сообщение Penumbra » 01.03.2009 (Вс) 13:50

товарищи! а как преобразовать 4 байта в знаковое число с плавающей точкой
например
D6 DB C9 84 = +50,46
54 35 CB 84 = +50,8

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Преобразовать 4 байта в Single

Сообщение iGrok » 01.03.2009 (Вс) 14:03

Penumbra писал(а):товарищи! а как преобразовать 4 байта в знаковое число с плавающей точкой
например
D6 DB C9 84 = +50,46
54 35 CB 84 = +50,8

Это ты как такие цифры получил? Что это за формат такой?
label:
cli
jmp label

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Преобразовать 4 байта в Single

Сообщение Penumbra » 01.03.2009 (Вс) 19:34

я их неполучил, я их в задании с примера списал
D6 DB C9 84 - байтовый массив читать с парава на лево
написано что это IEEE-стандарт представления чисел с плавающей точкой

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Преобразовать 4 байта в Single

Сообщение iGrok » 01.03.2009 (Вс) 20:59

Penumbra писал(а):я их неполучил, я их в задании с примера списал
D6 DB C9 84 - байтовый массив читать с парава на лево
написано что это IEEE-стандарт представления чисел с плавающей точкой

Ну так у тебя в задании, наверное, и описание формата есть? Вот им и воспользуйся. Стандартной ф-ции нет, насколько я знаю.

UPD:
Если делать сообразно описанию 32битного IEEE-float в википедии (да и сообразно тому, как давали этот же формат в универе), то получается так:
Код: Выделить всё
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


Но это всё равно никак не стыкуется с теми числами, что приведены у тебя.
label:
cli
jmp label


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 62

    TopList