1、32位浮点数格式分析
参见大龙10简书:https://www.jianshu.com/p/cdb96ac5555e
2、字符串转换成16进制字符串
function StrToHexStr(const S:string):string;
3、十进制 to 二进制
function IntToBin(Value: LongInt;Size: Integer): String;
4、二进制 to 十进制
function BintoInt(Value: String): LongInt;
5、十六进制 to 二进制
function HextoBinary(Hex:string):string;
6、十六进制 to 十进制 浮点型
function HextoFloat(s:string):real;
7、源程序
{字符串转换成16进制字符串}
function StrToHexStr(const S:string):string;//字符串转换成16进制字符串
var
I:Integer;
begin
for I:=1 to Length(S) do
begin
if I=1 then
Result:=IntToHex(Ord(S[1]),2)
else Result:=Result+' '+IntToHex(Ord(S[I]),2);
end;
end;
{十进制 to 二进制}
function IntToBin(Value: LongInt;Size: Integer): String;
var
i: Integer;
begin
Result:='';
for i:=Size-1 downto 0 do begin
if Value and (1 shl i)<>0 then begin
Result:=Result+'1';
end else begin
Result:=Result+'0';
end;
end;
end;
{二进制 to 十进制}
function BintoInt(Value: String): LongInt;
var
i,Size: Integer;
begin
Result:=0;
Size:=Length(Value);
for i:=Size downto 1 do
begin
if Copy(Value,i,1)='1' then
Result:=Result+(1 shl (Size-i));
end;
end;
function floatBintoInt(Value: String): real;
var
i,Size: Integer;
begin
Result:=0;
Size:=Length(Value);
for i:=Size downto 1 do
begin
if Copy(Value,i,1)='1' then
Result:=Result+1/(1 shl i);
end;
end;
{十六进制 to 二进制}
function HextoBinary(Hex:string):string;
const
BOX: array [0..15] of string =
('0000','0001','0010','0011',
'0100','0101','0110','0111',
'1000','1001','1010','1011',
'1100','1101','1110','1111');
var
i:integer;
begin
for i:=Length(Hex) downto 1 do
Result:=BOX[StrToInt('$'+Hex[i])]+Result;
end;
{十六进制 to 十进制 浮点型}
function HextoFloat(s:string):real;
var
b,temp:string;
e:integer;
f:real;
begin
b:=HextoBinary(s);
temp := copy(b,2,8);
e:=BintoInt(temp)-127;
temp := copy(b,10,23);
f := 1+floatBintoInt(temp);
if(copy(b,1,1)='0')then
result := power(2,e)*f //-----要引用单元math
else
result :=-power(2,e)*f;
end;
8、调用
十六进制浮点数如C1480000,转成十成制数-12.5
str3:= inttohex(ord(t3[4]),2)+ inttohex(ord(t3[5]),2) ;
memo1.Lines.Add('com46接收到温湿度表数据:'+str3) ;
if (ord(t3[4])>=$80) then
wd0:= HextoFloat( str3)/10
else
wd0:=(ord(t3[4])*256+ ord(t3[5]))/10;