請教一下,Delphi如何實作以下二進制字串和浮點數互相轉換的公式:
0011 1101 1000 1111 0101 1100 0010 1001<=>0.07
這個二進制是從PLC讀到的DWord型別的值,我把所有的位取出來的,如果直接DWord型別可以轉Float型別,那最好不過。
謝謝!
uj5u.com熱心網友回復:
自己回答,不需要先轉二進制字串,直接DWord轉Single就可以了,希望能幫到其他人,花了好幾個小時。function DWordToSingle(ASource:DWord):Single;
var
ByteArray:array[0..3] of byte;
begin
ByteArray[3]:=HiByte(LoWord(ASource));
ByteArray[2]:=LoByte(LoWord(ASource));
ByteArray[1]:=HiByte(HiWord(ASource));
ByteArray[0]:=LoByte(HiWord(ASource));
result:=PSingle(@ByteArray)^;
end;
function SingleToDWord(ASource:Single):DWord;
var
tmpSingle:PSingle;
ByteArray:array[0..3] of byte;
wHighWord,wLowWord:Word;
begin
tmpSingle:=@ASource;
Move(ASource,ByteArray,SizeOf(ASource));
wHighWord:=MakeWord(ByteArray[0],ByteArray[1]);
wLowWord:=MakeWord(ByteArray[2],ByteArray[3]);
result:=MakeLong(wLowWord,wHighWord);
end;
function DWordToBinary(const ASource:Dword):string;
var
I:Integer;
begin
result:='';
for I:=0 to 31 do
result:=result + Format('%x',[byte((ASource shr I) and 1)]);
end;
uj5u.com熱心網友回復:
function BSWAP(d :LONGWORD) : LONGWORD;
asm
{$IFDEF CPUX64}
MOV EAX , ECX
{$ENDIF}
BSWAP EAX
end;
function DWordToSingle(ASource:DWord):Single;
begin
ASource := BSWAP(ASource);
Result := PSingle(@ASource)^;
end;
function SingleToDWord(ASource:Single):DWord;
begin
Result := BSWAP(PLongWord(@ASource)^);
end;
uj5u.com熱心網友回復:
答案總是一個接一個:
rr = packed record
case integer of
0: ( DW: DWORD );
1: ( S: Single);
end;
function DWordToSingle2(ASource:DWord):Single;
var
r : rr;
begin
r.dw :=asource;
result:=r.S;
end;
ShowMessage(FloatToStr(DWordToSingle2($3D8F5C29)));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67830.html
標籤:語言基礎/算法/系統設計
