Недавно
передо мной встала задача - передать вещественное число типа Single, размером в
4 байта, по последовательному порту. Естественно, перед тем, как передавать это
число, а передача должна осуществляться побайтно, необходимо разбить
вещественное число на байты. Покопался в Интернете, но ничего толкового не
нашел, удивился - по моему мнению, с такой задачей кто-нибудь уже должен был
столкнуться. Поэтому пришлось самому попытаться найти решение. Через
некоторое время такое решение появилось. Для преобразования я применил процедуру Move, позволяющую передать переменную в поле другой переменной, причем, что важно, вне зависимости от типа. При использовании данной процедуры, конечно, надо соблюдать осторожность, чтобы не выйти за пределы области памяти, отведенной под переменную - приемник. Для контроля за количеством передаваемых байт используется функция SizeOf(). Поскольку длина вещественного типа в Delphi не превышает 10 байт, индекс байтового массива ограничен 9.
type TArrReal = array[0..9] of byte;
//===============================================
{Функция производит разбиение
вещественного числа inReal на байты, которые
размещает в массиве bytes, и возвращает количество байт, которое занимает
переменная inReal}
function RealToByte(inReal : single;var
bytes:TArrReal ):integer;
var i : integer;
begin
i:=sizeof(inReal);
move(inReal,bytes,i);
result:=i;
end;
//===============================================
{Функция производит сборку
вещественного числа из байтов, которые размещены в массиве bytes, и возвращает значение вещественного числа}
function ByteToReal(bytes:TArrReal):single;
var i : integer;
begin
i:=sizeof(Result);
move(Bytes,Result,i);
end;
//===============================================
{Эта процедура позволяет проверить
корректность преобразования}
//===============================================
procedure TForm1.Button1Click(Sender:
TObject);
var b:TArrReal;
i,j:integer;
s:string;
r:single;
begin
i:=RealToByte(-371955,b);
r:=ByteToReal(b);
str(r:10:7,s);
s:=s+' ';
for j :=0 to i-1 do s:=s+inttohex(b[j],2)+' ';
Form1.Label1.Caption:=s;
end;
//===============================================
|