C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Байты во float
Rob
Отправлено: 12.02.2006, 09:31


Не зарегистрирован







Может кто встречался с такой задачей.

тип float — 32 разряда, тобишь 4 байта
Есть четыре байта отдельно, т.е. четыре переменных (иль массив).
Нужно перевести эти четыре байта в тип флоат. Т.е. типа соединить.

float = [xx xx xx xx]
где xx — один байт
GoodWin
Отправлено: 12.02.2006, 10:36


Дежурный стрелочник

Группа: Участник
Сообщений: 50



char b1,b1,b2,b3;
float result;
result = (b1) | (b2>>8) | (b3>>16)|(b4>>32);

Хотя может и не так, не тестировал. Float записывается в формате с плавающей запятой, поэтому может неверно отображать цифру.

Отредактировано GoodWin — 12/02/2006, 10:38
Rob
Отправлено: 12.02.2006, 12:05


Не зарегистрирован







Нашел команду

extern PACKAGE void __fastcall Move(const void *Source, void *Dest, int Count);

Может ктонить подскажет, пайдет ли она? и есть ли какие нибудь особенности этой команды?

Мне некогда было еще ее опробовать.
Grigoriy
Отправлено: 13.02.2006, 02:29


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE
четыре переменных


CODE

//.......
unsigned char b1;
//.........
unsigned char b2;
//.........
unsigned char b3;
//.........
unsigned char b4;
//.........
float ed;
//.........
asm{
mov al,b1;
mov byte ptr ed,al;
mov al,b2;
mov byte ptr ed+1,al;
mov al,b3;
mov byte ptr ed+2,al;
mov al,b4;
mov byte ptr ed+3,al;
};
//.......


QUOTE
(иль массив)

CODE

//.......
float ed;
//.......
unsigned char b[4];
//.......
asm{
mov eax,dword ptr b;
mov ed,eax;
};
//.......


Отредактировано Grigoriy — 13/02/2006, 02:37
Rius
Отправлено: 13.02.2006, 07:13


Мастер участка

Группа: Участник
Сообщений: 321



CODE
union {float F;BYTE Byte[4]; long int L;} temp;
temp.Byte[0] = ...;
temp.Byte[1] = ...;
temp.Byte[2] = ...;
temp.Byte[3] = ...;
float result = temp.F;
olegenty
Отправлено: 13.02.2006, 07:43


Ветеран

Группа: Модератор
Сообщений: 2412



вот мне тоже вариант Rius первым в голову пришёл.
** Jonick
Отправлено: 13.02.2006, 11:57


Не зарегистрирован







Можно вот так:

float *point_a;
float a;
unsigned char buf_float[4]={0,0,0x60,0x40};
point_a=&a;
memcpy(point_a,buf_float,4);
Edit1->Text=a;
в данном примере результат будет 3,5.
Массив сам заполнишь тебе ж известны байты (с младшего до старшего в примере: 1байт — 0; 2байт — 0;3байт — 0х60; 4байт — 0х40;).

Вернуться в Вопросы программирования в C++Builder