如何将十六进制数转换为浮点数(50分)

  • 主题发起人 主题发起人 pipi_lu
  • 开始时间 开始时间
P

pipi_lu

Unregistered / Unconfirmed
GUEST, unregistred user!
我取得一个以32位16进制数表示的浮点数,如$xxxxxxxx,如何将其转换为浮点数?
 
不明白你的意思,直接赋值就是了.
如果是字符串('$XXXXXXX')要转换浮点数,先转为Integer/Int64
HexToInt(string)
 
function HexToFloat(Str:String):Single
//Single是32位浮点数类型
var
P:PByte;
i:Byte;
begin
P:=@Result;
for i:=0 to Length(Str) div 2-1 do
begin
P^:=StrToInt('$'+Copy(Str,i*2+1,2));
Inc(P);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=FloatToStr(HexToFloat(Edit1.Text))
// eg: 60E51A41 -> 9.680999...
end;
 
To:creation-zy
大侠:您能解释上面函数是怎么实现的吗?不甚感谢!
 
这么难的东西居然有人会!佩服,佩服......
 
所谓的浮点数在内存中也是以32Bit来表示的(单精度浮点数)。我们可以将一个浮点数
占用的内存看成4个连续的Byte类型数据。另外,众所周知,计算机中的16进制数都是成对
出现的,每两个16进制数表示一个0..255的ASCII码。如此一来,16进制到浮点数的转换就
非常简单了:将它们之间用Byte联系起来即可!因此,我们所要做的仅仅是两位两位的将
16进制字符串转换为Byte类型,并按顺序存放在浮点数占用的内存中——就这么简单 :)
需要指出的是,由于浮点数是基于2进制的,转换为十进制小数来显示的时候难免有一些
精度上的损失而产生长达10几位的小数部分。我们可以用Format('%.4f',[MyFloatVar])来
使显示更加清晰。
 
非常感谢,希望以后多交流:我的QQ:9066441
creation-zy大侠,希望能得到你的QQ号码。
 
谢谢creation-zy大侠的详细解答
 
creation-zy 好人啊
谢谢
 
后退
顶部