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