将float / double转换为IEEE十六进制表示

时间:2015-11-05 12:37:30

标签: windbg

我试图在WinDbg中查看浮点值的十六进制表示。使用.formats

可以很容易地将十六进制值转换为浮点值
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,但这只会使得必要的步骤更加复杂。

是否有更简单的内置方法将浮点数/双精度转换为十六进制?

1 个答案:

答案 0 :(得分: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]
    );
}
相关问题