浮點數float轉換成十六進制字符串的方法(FloatToHex)

本文從原文:http://blog.csdn.net/cswangbin/article/details/6053569得到靈感

重新書寫了float型轉爲十六進制的delphi程序

[delphi] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. Function FloatToHex(Value: single): string;  
  2. var  
  3.   l, i: integer;  
  4.   HexText,tempHexText,temp: String;  
  5. begin  
  6.   SetLength(HexText, 2 * SizeOf(Value));  
  7.   BinToHex(pchar(@Value), pchar(@HexText[1]), SizeOf(Value));  
  8.   l := length(HexText);  
  9.   for i := (l div 2downto 1 do  
  10.   begin  
  11.     temp:=copy(HexText,(2*i-1),2);  
  12.     tempHexText := tempHexText + temp;  
  13.   end;  
  14.     result := tempHexText;  
  15. end;  
例子:

[delphi] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. procedure TForm6.addButtonClick(Sender: TObject);  
  2. begin  
  3.   editHar3.Text := FloatToHex(-12.545); // strtofloat(editHar1.Text)  
  4. end;  

顯示結果爲 C148B852,結果正確,-12.545~C148B852

注意添加

uses StrUtils{截取字符串單元};

下面是原文:

 我們在研究封包技術時,經常會碰到將浮點數轉換成十六進制形式。比如在遊戲中人物的座標,經常就用浮點數來表示。怎麼將浮點數轉換成十六進制字符串形式呢?下面我將寫出其在DELPHI中的方法。
       先講點背景吧,我們通常說的小數,一般就是指浮點數,而且當值不大的時候,泛指單精度浮點數。在delphi中,Single是單精度浮點數,佔用4個字節存儲,高精度的Double佔用8個字節,Real是borland早期用過的,佔用6個字節,現在逐漸淡出了。
       通過調用Delphi中的BinToHex函數可以很容易實現其轉換。下面是Delphi的原型。

[delphi] view plaincopy
  1. procedure BinToHex(Buffer: PAnsiChar; Text: PAnsiChar; BufSize: Integer); assembler;  
  2. const  
  3.   Convert: array[0..15of AnsiChar = AnsiString('0123456789ABCDEF');  
  4. var  
  5.   I: Integer;  
  6. begin  
  7.   for I := 0 to BufSize - 1 do  
  8.   begin  
  9.     Text[0] := Convert[Byte(Buffer[I]) shr 4];  
  10.     Text[1] := Convert[Byte(Buffer[I]) and $F];  
  11.     Inc(Text, 2);  
  12.   end;  
  13. end;  

      解釋一下該函數:內存中地址爲Buffer,長度爲BufSize的一段數據轉成16進制並存入Text所指向的內存地址中,Text的長度至少需要BufSize*2才能放下轉換後的數據。
      有了這些背景,就可以理解我下面寫的代碼了。

[delphi] view plaincopy
  1. Function FloatToHex(Value:single):string;  
  2. var  
  3.   HexText: String;  
  4. begin  
  5.   SetLength(HexText,2*SizeOf(Value));  
  6.   BinToHex(pchar(@Value),pchar(@HexText[1]),SizeOf(Value));  
  7.   return Hextext  
  8. end;  

      比如在調用的時候,假設傳入3.1415,得到的結果輸出爲560E4940,注意這裏的結果是低位在前,高位在後。意思就是40490E56就是我們通常說的3.1415。
      你可以用Greatboy寫的單精度浮點數轉換工具驗證。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章