[英]C++ Conversion from Float to Hex not correct when writing to Memory
我正在尝试将浮点值(0.75)转换为十六进制并将转换后的值写入内存。
char Actual[4];
float f = 0.75f;
int i = *(reinterpret_cast<int*>(&f));
wsprintf(Actual, "%08X", i);
MessageBox(NULL, Actual, "Float", NULL);
unsigned long OldProtection;
VirtualProtect((LPVOID)(0x01234567), 4, PAGE_EXECUTE_READWRITE, &OldProtection);
memcpy((LPVOID)0x01234567, Actual, 4);
VirtualProtect((LPVOID)(0x01234567), 4, OldProtection, NULL);
转换效果很好,并在使用MessageBox时输出正确的值(3F400000)。
但是当使用memcpy将转换后的值写入内存时,目标地址的值为30303030而不是3F400000。
我想我错过了一些额外的步骤。 可能是什么问题呢?
您正在将文字写入“ Actual
。
十六进制30
是零位的ASCII码。
你为什么想这么做? 是否有一些特殊的地址 - 是否被其他代码使用(除了更改它)或者您只是想通过使用外部工具检查0x01234567的进程内存来查看浮点数的“十六进制值”? 在每种情况下,您都可以在所需位置复制'f'变量中的数据。
unsigned long OldProtection;
VirtualProtect((LPVOID) (0x01234567), 4, PAGE_EXECUTE_READWRITE, &OldProtection);
memcpy((LPVOID) 0x01234567, &f, sizeof(float));
VirtualProtect((LPVOID) (0x01234567), 4, OldProtection, NULL);
除非您有特殊原因(通常数据存储在可读/可写位置),否则“VirtualProtect”方法调用几乎不需要。
顺便提一下,这里有一些有用的信息 - 你正在使用的'十六进制值'是一个特定于体系结构的信息,它表示CPU浮点算术指令所需的某种位格式的编码浮点数。 在x86中,这是IEEE 754 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.