繁体   English   中英

写入内存时,C ++从Float到Hex的转换不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM