Windbg 将浮点/双精度转换为IEEE十六进制表示

Windbg 将浮点/双精度转换为IEEE十六进制表示,windbg,Windbg,我试图在WinDbg中看到浮点值的十六进制表示形式。使用格式将十六进制值转换为浮点值很容易: 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) Ev

我试图在WinDbg中看到浮点值的十六进制表示形式。使用
格式将十六进制值转换为浮点值很容易:

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
但是,我不想在调试期间更改内存的内容。为了避免与程序内存冲突,我可以使用
.dvalloc
,但这只会使必要的步骤更加复杂


有没有一种更简单的内置方法可以将float/double转换为hex?

我有一个粗略的代码,我做了这件事,我清理了一下,上传了src和一个编译过的dll,看看它能做什么

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]
    );
}
#包括
联合浮托卡尔酒店{
浮动flt;
无符号字符fltc[4];
};
类EXT_类:公共ExtExtension{
公众:
EXT_命令_方法(f2h);
};
EXT_DECLARE_GLOBALS();
EXT_命令(
f2h,
“将浮点转换为十六进制字符串”,
“{opt:+:}}{;s;;示例用法!f2h 9.2将返回4113333}”
)
{
PCSTR arg=GetUnnamedArgStr(0);
char*endptr;
双输入=标准输入(arg和endptr);
漂浮炭灌注;
inflt.flt=(浮动)输入;
出去(
“%-30s%02X%02X%02X%02X\n”,
“32位浮点”,
内部fltc[3],
内部fltc[2],
内部fltc[1],
外语教学[0]
);
}

您可以使用
calc
:)。说真的,如果你没有找到它,它可能不存在,但可以肯定的是,我会给你发封邮件defragtools@microsoft.com. 最有可能的是,安德鲁·理查兹(Andrew Richards)会拿起它,你会得到一个明确的答案。@Lievenkeers-Maekers:这是个好主意。谢谢,这似乎奏效了。仅为此目的加载扩展对于任务来说仍然有点太多,但是如果您已经编写了此代码来实现任务,那么可能没有更简单的解决方案。有没有可能我不能在你的代码中使用负浮点数?我切换到{custom}}和GetRawArgs()以绕过该限制。(我承认:Github上的DLL对我不起作用,所以我自己编译了它,首先使它成为Visual Studio解决方案。)我不喜欢自己解析,所以想知道为什么当我将输入作为字符串时,负输入不起作用。结果表明,命名参数的默认选项以/或-开始,因此框架将-9.2解释为命名参数,而不是字符串未命名参数,并使用指令{{opt:+}禁用它现在输入否定参数与框架解析一起工作,github src已更改
#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]
    );
}