16进制字符串为:405C7107AD9735B3,
将该16进制表示的浮点数转换成10进制数为:113.766093633332,
求转换程序,
该程序最好和C#中的BitConverter.ToDouble()具有相同效果,
谢谢
将该16进制表示的浮点数转换成10进制数为:113.766093633332,
求转换程序,
该程序最好和C#中的BitConverter.ToDouble()具有相同效果,
谢谢
解决方案 »
- str:array[0..80] of string 可以这样用吗?
- 有请叮叮当当回答:teechart的使用问题.
- 【活動】Delphi社区改版慶祝活動之二--恢復被刪信譽分!!!
- 问一个图形拓扑结构的问题,高手帮忙
- 这个问题怎么解决?
- 高水准报表--三层结构中打印技术取得新进展
- 关于文件生成和存储的问题!
- SQL 语句出了错误!!!!!!!!!!!!!!
- 初试接口
- 编程的水平取决于你了解WIN API多少?
- fastreport怎样设计表格固定格式,格式不随数据条数变动
- delphi DEV控件 那个cxGrid,我其中有一个列是checkbox,但是程序运行后为什么我选不中checkbox,怎样才能选中。。
function HexToDouble(cs:string):Double;
const hexstr: array [0..15] of string =
('0000','0001','0010','0011',
'0100','0101','0110','0111',
'1000','1001','1010','1011',
'1100','1101','1110','1111');
var s,s2,intstr:string;
a,b,i,len:integer;
x:double;
function BintoInt(binstr:String):Int64;
var i:integer;
begin
Result:=0;
len:=Length(binstr);
for i:=1 to len do Result:=Result+(1 shl (len-i))*StrToInt(binstr[i]);
end;
begin
s:='';
for i:=Length(cs) downto 1 do s:=hexstr[StrToInt('$'+cs[i])]+s;
intstr:=copy(s,2,11);
s2:=StringOfChar('0',16-length(intstr))+intstr;
a:=BintoInt(s2)-1023;
delete(s,1,12);
s:='1'+s;
b:=BintoInt(copy(s,1,a+1));
s:=copy(s,a+2,length(s));
x:=0;
len:=Length(s);
for i:=1 to len do if s[i]='1' then x:=x+1/(int64(1) shl i);
Result:=b+x;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(floattostr(HexToDouble('405C7107AD9735B3')));
end;
最高位是符號位,第62位至52位是2的指數階碼,後面51位至0位是尾數。前面405是符號及階碼轉成二進制就是:
0 10000000101
正數,所以最高位為0,10000000101就是階碼0x405-0x3FF=6就是階碼,後面的C7開始的就是尾數
百度下這方面的資料,根據規則我相信你能寫出轉換函數。
const hexChars='0123456789ABCDEF';
datastr='32 46 35 42 31 39 30 30 2D 31 43 46 45 2D 30 38 30 31 2D 41';
var s,tmp1,tmp2:string;
x:integer;
function Getbyte(hexstr:string):integer;
begin
Result:=-1;
if length(hexstr)<>2 then exit;
Result:=(pos(hexstr[1],hexChars)-1) shl 4 + pos(hexstr[2],hexChars)-1;
end;
begin
s:=datastr;
tmp1:='';
while length(s)>0 do begin
x:=Getbyte(s[1]+s[2]);
tmp2:=tmp2+inttostr(x)+',';
tmp1:=tmp1+char(x);
delete(s,1,3);
end;
showmessage(datastr+#13+tmp2+' ___ '+tmp1);
end;
procedure TForm1.Button1Click(Sender: TObject);
function HexStringToDouble(const AHexString :string):double;
var
i:integer;
P: Pointer;
ByteArr : array [0..7] of Byte;
begin
for i := 0 to 7 do
ByteArr[7-i] := StrToInt('$'+Copy(AHexString,2*i+1,2));
P := @ByteArr;
Result := Double(P^);
end;
begin
ShowMessage(FloatToStr(HexStringToDouble('405C7107AD9735B3')));
end;
function HexStringToDouble(const AHexString :string):double;
var
i:integer;
P: Pointer; //定義一個無類型指針
ByteArr : array [0..7] of Byte; //定義一8個字節數組用於存放雙精度浮點數。
begin
for i := 0 to 7 do //按字節(2個十六進制字符)循環取出十六進制數存到字節數組元素。
ByteArr[7-i] := StrToInt('$'+Copy(AHexString,2*i+1,2));//在內存中雙精度浮點數
//占用8個字節,按低位在前,高位在後原則存放。
P := @ByteArr;//取得數組存放的首地址(指針)
Result := Double(P^);//將指針指向的數強制轉換為雙精度浮點數。
end;
begin
ShowMessage(FloatToStr(HexStringToDouble('405C7107AD9735B3')));
end;
function HexStringToDouble(const AHexString :string):double;
begin
if Length(AHexString)<>16 then Result := 0
else PInt64(@Result)^ := StrToInt64Def('$' + AHexString , 0);
end;
我记得我回答过这个问题.