簡體   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