Преобразование uint в float в C ++ - PullRequest
3 голосов
/ 20 февраля 2011

Я использую ReadProcessMemory, чтобы получить 4 байта.Функция позволяет мне представить это как беззнаковое целое.Я хочу представить это как поплавок;или, другими словами, используйте байтовое представление этого uint для моего float.Я пробовал приведение, но оно не работает.

Пример: представление байтов: 94 4E 2D 43

uint: 1127042708

float: 173.3069458 ..

Любая помощь будет оценена.

Ответы [ 4 ]

5 голосов
/ 20 февраля 2011

ReadProcessMemory() принимает указатель на void, поэтому вы можете указать ему значение float.

float f;
ReadProcessMemory(hProcess, lpBaseAdress, &f, sizeof(f), NULL); 

Обратите внимание, что оно сломается, когда sizeof(unsigned int) != sizeof(float).

Приведение не будет работать, потому что оно будет принимать значение, а не представление целого числа.

5 голосов
/ 20 февраля 2011

Самый безопасный способ (который учитывает возможные проблемы с выравниванием) - использовать объединение

#include <stdio.h>

int main(int argc, const char *argv[])
{
    union FloatOrUInt
    {
        float asFloat;
        unsigned int asUInt;
    } fu;

    fu.asUInt = 1127042708;
    printf("Float value = %0.6f\n", fu.asFloat);

    return 0;
}

Обратите внимание, однако, что даже если вы знаете, что числа с плавающей точкой имеют стандартный формат IEEE754, могут быть проблемы для * порядок байт 1005 *.

5 голосов
/ 20 февраля 2011
UINT d= 0x432D4E94;
float f= *(float*)&d; // 173.30695
2 голосов
/ 20 февраля 2011
unsigned int input = 1127042708;

float output = *reinterpret_cast<float*>(&input)

или

float output = *(float*)(&input)
...