我试图在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
,但这只会使得必要的步骤更加复杂。
是否有更简单的内置方法将浮点数/双精度转换为十六进制?
答案 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]
);
}