Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
BNN
Зарегистрирован: 22.03.2007 Сообщения: 2
|
Добавлено: Чт Мар 22 2007 07:27 Заголовок сообщения: Есть 4 байта с вещественным числом. Как его получить в Singl |
|
|
Имеется последовательность из 4 байт (например 3F 8F BE 76). В этих 4 байтах находится вещественное число, как оно лежит в памяти компьютера, т.е. в виде Z E M , где Z-знак числа 1 бит , E - порядок числа 8 бит , M - мантисса 23 бита . Как их положить в память и получить оттуда вещественное число Single (для примера - 1.123). Программа на VB. |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Чт Мар 22 2007 10:20 Заголовок сообщения: |
|
|
Формат вещественных чисел может отличаться в различных системах. Так же нельзя забывать, что в различных системах используется различный порядок байтов. В некоторых ЯП существуют стандартные функции преобразования массива байтов в действительное число. В Java возможно преобразовать массив байтов в действительное число, используя унифицированный формат.
Насчет VB сказать не могу. Судя по тому что Вы его используете, скорее всего, число ваше хранится в формате IEEE 754. Можно попытаться распарсить самому, но я бы рекомендовал найти стандартную функцию. _________________ Самоловских Виталий aka Kefir |
|
Вернуться к началу |
|
|
BNN
Зарегистрирован: 22.03.2007 Сообщения: 2
|
Добавлено: Чт Мар 22 2007 12:38 Заголовок сообщения: Re: Есть 4 байта с вещественным числом. Как его получить в S |
|
|
BNN писал(а): | Имеется последовательность из 4 байт (например 3F 8F BE 76). В этих 4 байтах находится вещественное число, как оно лежит в памяти компьютера, т.е. в виде Z E M , где Z-знак числа 1 бит , E - порядок числа 8 бит , M - мантисса 23 бита . Как их положить в память и получить оттуда вещественное число Single (для примера - 1.123). Программа на VB. |
Вот что получилось:
Код:
Function Reality(str As String) As String 'str-строка в 16виде 4 байта например 3F8FBE76
Dim ByteFloat(3) As Byte, valFloat As Single
ByteFloat(3) = dec(Left(str, 2)) 'функция dec преобразует из 16-ой строки в байт, побайтно
ByteFloat(2) = dec(Mid(str, 3, 2)) 'ложим в массив из 4 байт, преворачиваем младшее и старшее слово
ByteFloat(1) = dec(Mid(str, 5, 2))
ByteFloat(0) = dec(Mid(str, 7, 2))
CopyMemory valFloat, ByteFloat(0), 4 'копируем в байты в память
Reality = CStr(valFloat) 'и берем оотуда флоатом
End Function
Ну и copymemory должна быть задекларирована:
Код:
Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (Destination As Any, _
Source As Any, ByVal Length As Long)
Всем спасибо.[/code] |
|
Вернуться к началу |
|
|
|