2015-11-05 120 views
2

我試圖在WinDbg中看到float值的十六進制表示形式。這是很容易可以將十六進制值轉換爲使用.formats浮動:將float/double轉換爲IEEE十六進制表示

0:000> .formats 0x41133333 
    [...] 
    Float: low 9.2 high 0 
    Double: 5.3941e-315 

但是關於倒過來怎麼辦?

我已經試過

0:000> ? 9.2 
Syntax error at '9.2' 
0:000> ?? 9.2 
double 9.1999999999999993 
0:000> ? @@(9.2) 
Evaluate expression: 9 = 00000000`00000009 
0:000> ? @@(reinterpret_cast<unsigned int64>(9.2)) 
Evaluate expression: 9 = 00000000`00000009 

到目前爲止,我可以轉換一個浮動的唯一方法是通過一個間接在內存:

0:000> ef 00000001`00003acc 9.2 
0:000> dd 00000001`00003acc L1 
00000001`00003acc 41133333 

不過,我不喜歡改變的內容調試期間的內存。爲了與程序的內存發生衝突,我可以使用.dvalloc,但它只是使得必要的步驟更加複雜。

是否有一個更容易的內置方式將float/double轉換爲hex?

+0

你可以使用'calc' :)。嚴重的是,如果你還沒有找到它,它可能不存在,但可以肯定的是,我會發郵件到[email protected]。安德魯理查茲很可能會把它拿起來,你會得到一個明確的答案。 –

+0

@LievenKeersmaekers:這是個好主意。 –

回答

1

我有這樣做我清理了一下,上傳src和編譯的DLL來看看它會做你想要什麼

https://github.com/blabberer/FloatToHex

在src簡單engextcpp

粗碼
#include <engextcpp.hpp> 
union FloatToChar { 
    float   flt; 
    unsigned char fltc[4]; 
}; 
class EXT_CLASS : public ExtExtension { 
public: 
    EXT_COMMAND_METHOD(f2h); 
}; 
EXT_DECLARE_GLOBALS(); 
EXT_COMMAND(
    f2h, 
    "Converts Float to HexString", 
    "{{opt:+:}}{;s;<float>;example usage !f2h 9.2 will return 41133333}" 
    ) 
{ 
    PCSTR arg = GetUnnamedArgStr(0); 
    char *endptr; 
    double in = strtod(arg,&endptr); 
    FloatToChar inflt; 
    inflt.flt = (float)in; 
    Out(
     "%-30s%02X%02X%02X%02X\n", 
     "32_Bit_Float", 
     inflt.fltc[3], 
     inflt.fltc[2], 
     inflt.fltc[1], 
     inflt.fltc[0] 
    ); 
} 
+0

謝謝,這似乎工作。僅僅爲此目的加載擴展仍然看起來有點太多,但如果你已經編寫了這個代碼來完成這個任務,那麼可能沒有更簡單的解決方案。是否有可能我的代碼中不能使用負數浮點數?我切換到{{custom}}和GetRawArgs()來繞過這個限制。 (我承認:Github上的DLL並不適合我,所以我自己編譯它,首先將它編譯爲Visual Studio解決方案。) –

+0

我不喜歡解析自己,所以想知道爲什麼負面輸入不工作,當我正在以字符串形式輸入的結果是,命名參數的默認選項以/或 - 開頭,所以框架將-9.2解釋爲命名參數,而不是字符串未命名參數,並且現在正在輸入的{{opt:+}}命令將其禁用負面的論據與框架解析github src改變 – blabb