求十六进制表示的浮点数转换为十进制浮点数的函数

时间:2022-01-11 19:13:26
16进制字符串为:405C7107AD9735B3,
将该16进制表示的浮点数转换成10进制数为:113.766093633332,
求转换程序,
该程序最好和C#中的BitConverter.ToDouble()具有相同效果,
谢谢

23 个解决方案

#2


自己写嘛。。

#3


引用 2 楼 HSFZXJY 的回复:
自己写嘛。。


怎么写?

#4


405C7107AD9735B3这个的原始数据是什么数据来的,打比方:123->405C7107AD9735B3说下你的原始数据这样一说让人很难明白。

#5


有很多把内存转为16进制显示,HexToData、DataToHex就是完成这个功能。

#6


_a:=strtoint('$'+'0A')

showmessage(inttostr(_a));  

显示输出10。

所以你写个function ,按你的格式要求把你的待解数传进去,然后返回一个解好的即可……

#7


你的16进制数直接转10进制结果是4637705994075846067,所以你的这个转化一定是有自己的格式的……
这种具体的问题你得自己解决了……

#8


如何把这串字符"32 46 35 42 31 39 30 30 2D 31 43 46 45 2D 30 38 30 31 2D 41",以字节为单位,转成十进制数呢?

#9


hextobin

#10


楼主要去空格才能用hextobin

#11



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;

#12


這個是IEEE754標准規定的雙精度(64位)浮點數表示法的機器碼,共8個字節。
最高位是符號位,第62位至52位是2的指數階碼,後面51位至0位是尾數。前面405是符號及階碼轉成二進制就是:
0 10000000101
正數,所以最高位為0,10000000101就是階碼0x405-0x3FF=6就是階碼,後面的C7開始的就是尾數
百度下這方面的資料,根據規則我相信你能寫出轉換函數。

#13


引用 8 楼 wuwenzhe 的回复:
如何把这串字符"32 46 35 42 31 39 30 30 2D 31 43 46 45 2D 30 38 30 31 2D 41",以字节为单位,转成十进制数呢?

procedure TForm1.Button2Click(Sender: TObject);
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;

#14


由我13楼回复的运行结果看,搂主收到的是个PID号:2F5B1900-1CFE-0801-A ('32 46 35 42 31 39 30 30 2D 31 43 46 45 2D 30 38 30 31 2D 41')

#15


來一個簡單點的8字節十六進制字符串轉雙精度浮點:
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;

#16


楼上厉害!!

受教了。

#17


引用 16 楼 gzzai 的回复:
楼上厉害!!

受教了。


求15楼代码注释

#18


procedure TForm1.Button1Click(Sender: TObject);
  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;
 
 

#19



function HexStringToDouble(const AHexString :string):double;
begin
  if Length(AHexString)<>16 then Result := 0
  else PInt64(@Result)^ := StrToInt64Def('$' + AHexString , 0);
end;

求十六进制表示的浮点数转换为十进制浮点数的函数
我记得我回答过这个问题.

#20


引用 17 楼 wuwenzhe 的回复:
求15楼代码注释

要解决方案,你得到代码了;要注释,你也得到解释了,是否该连同http://bbs.csdn.net/topics/390270124帖子一起结了呢?

#21


哦,要结贴啦?!赶快学习一下

#22


围观一下专家!! 

#23


有没有C#的表示方法呢???
同样求学中-------------

#1


#2


自己写嘛。。

#3


引用 2 楼 HSFZXJY 的回复:
自己写嘛。。


怎么写?

#4


405C7107AD9735B3这个的原始数据是什么数据来的,打比方:123->405C7107AD9735B3说下你的原始数据这样一说让人很难明白。

#5


有很多把内存转为16进制显示,HexToData、DataToHex就是完成这个功能。

#6


_a:=strtoint('$'+'0A')

showmessage(inttostr(_a));  

显示输出10。

所以你写个function ,按你的格式要求把你的待解数传进去,然后返回一个解好的即可……

#7


你的16进制数直接转10进制结果是4637705994075846067,所以你的这个转化一定是有自己的格式的……
这种具体的问题你得自己解决了……

#8


如何把这串字符"32 46 35 42 31 39 30 30 2D 31 43 46 45 2D 30 38 30 31 2D 41",以字节为单位,转成十进制数呢?

#9


hextobin

#10


楼主要去空格才能用hextobin

#11



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;

#12


這個是IEEE754標准規定的雙精度(64位)浮點數表示法的機器碼,共8個字節。
最高位是符號位,第62位至52位是2的指數階碼,後面51位至0位是尾數。前面405是符號及階碼轉成二進制就是:
0 10000000101
正數,所以最高位為0,10000000101就是階碼0x405-0x3FF=6就是階碼,後面的C7開始的就是尾數
百度下這方面的資料,根據規則我相信你能寫出轉換函數。

#13


引用 8 楼 wuwenzhe 的回复:
如何把这串字符"32 46 35 42 31 39 30 30 2D 31 43 46 45 2D 30 38 30 31 2D 41",以字节为单位,转成十进制数呢?

procedure TForm1.Button2Click(Sender: TObject);
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;

#14


由我13楼回复的运行结果看,搂主收到的是个PID号:2F5B1900-1CFE-0801-A ('32 46 35 42 31 39 30 30 2D 31 43 46 45 2D 30 38 30 31 2D 41')

#15


來一個簡單點的8字節十六進制字符串轉雙精度浮點:
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;

#16


楼上厉害!!

受教了。

#17


引用 16 楼 gzzai 的回复:
楼上厉害!!

受教了。


求15楼代码注释

#18


procedure TForm1.Button1Click(Sender: TObject);
  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;
 
 

#19



function HexStringToDouble(const AHexString :string):double;
begin
  if Length(AHexString)<>16 then Result := 0
  else PInt64(@Result)^ := StrToInt64Def('$' + AHexString , 0);
end;

求十六进制表示的浮点数转换为十进制浮点数的函数
我记得我回答过这个问题.

#20


引用 17 楼 wuwenzhe 的回复:
求15楼代码注释

要解决方案,你得到代码了;要注释,你也得到解释了,是否该连同http://bbs.csdn.net/topics/390270124帖子一起结了呢?

#21


哦,要结贴啦?!赶快学习一下

#22


围观一下专家!! 

#23


有没有C#的表示方法呢???
同样求学中-------------