本文從原文:http://blog.csdn.net/cswangbin/article/details/6053569得到靈感
重新書寫了float型轉爲十六進制的delphi程序
- Function FloatToHex(Value: single): string;
- var
- l, i: integer;
- HexText,tempHexText,temp: String;
- begin
- SetLength(HexText, 2 * SizeOf(Value));
- BinToHex(pchar(@Value), pchar(@HexText[1]), SizeOf(Value));
- l := length(HexText);
- for i := (l div 2) downto 1 do
- begin
- temp:=copy(HexText,(2*i-1),2);
- tempHexText := tempHexText + temp;
- end;
- result := tempHexText;
- end;
- procedure TForm6.addButtonClick(Sender: TObject);
- begin
- editHar3.Text := FloatToHex(-12.545); // strtofloat(editHar1.Text)
- end;
顯示結果爲 C148B852,結果正確,-12.545~C148B852
注意添加
uses StrUtils{截取字符串單元};
下面是原文:
我們在研究封包技術時,經常會碰到將浮點數轉換成十六進制形式。比如在遊戲中人物的座標,經常就用浮點數來表示。怎麼將浮點數轉換成十六進制字符串形式呢?下面我將寫出其在DELPHI中的方法。
先講點背景吧,我們通常說的小數,一般就是指浮點數,而且當值不大的時候,泛指單精度浮點數。在delphi中,Single是單精度浮點數,佔用4個字節存儲,高精度的Double佔用8個字節,Real是borland早期用過的,佔用6個字節,現在逐漸淡出了。
通過調用Delphi中的BinToHex函數可以很容易實現其轉換。下面是Delphi的原型。
- procedure BinToHex(Buffer: PAnsiChar; Text: PAnsiChar; BufSize: Integer); assembler;
- const
- Convert: array[0..15] of AnsiChar = AnsiString('0123456789ABCDEF');
- var
- I: Integer;
- begin
- for I := 0 to BufSize - 1 do
- begin
- Text[0] := Convert[Byte(Buffer[I]) shr 4];
- Text[1] := Convert[Byte(Buffer[I]) and $F];
- Inc(Text, 2);
- end;
- end;
解釋一下該函數:內存中地址爲Buffer,長度爲BufSize的一段數據轉成16進制並存入Text所指向的內存地址中,Text的長度至少需要BufSize*2才能放下轉換後的數據。
有了這些背景,就可以理解我下面寫的代碼了。
- Function FloatToHex(Value:single):string;
- var
- HexText: String;
- begin
- SetLength(HexText,2*SizeOf(Value));
- BinToHex(pchar(@Value),pchar(@HexText[1]),SizeOf(Value));
- return Hextext
- end;
比如在調用的時候,假設傳入3.1415,得到的結果輸出爲560E4940,注意這裏的結果是低位在前,高位在後。意思就是40490E56就是我們通常說的3.1415。
你可以用Greatboy寫的單精度浮點數轉換工具驗證。