Массив ReadProcessMemory, шестнадцатеричный вывод в int - PullRequest
0 голосов
/ 19 ноября 2010

Я использую ReadProcessMemory, чтобы хорошо читать память процесса.Я смотрю на место, которое содержит значение 3325. Однако я смотрю на память в шестнадцатеричном вьюере, и значение отображается как FD0C = 0CFD = 3325. Поэтому, когда я читаю значение в свой массив символов, а затем пытаюсь преобразовать(Атои) Я получаю мусор.Я новичок в C ++, и мне интересно, есть ли функция, которая будет выполнять преобразование, или мне придется написать это сам (что я не против)?

    char num_char[16];
    _stackstart = _start + 0x28;
    ReadProcessMemory(hProcess,(void *)_stackstart, &num_char, 4, &lpRead);
    x = ...some conversion(num_char);
    if(stack != x)
    {tell me;}

Ответы [ 2 ]

0 голосов
/ 19 ноября 2010

Из кода, который вы публикуете, и вашего описания, это не похоже на то, что вы имеете дело со строкой символов ascii, а скорее с буфером, представляющим двоичное число. Чтобы преобразовать необработанное двоичное значение в целое число, вам просто нужно привести его к правильному значению. Обратите внимание, что вы должны быть осторожны, чтобы привести его к целочисленному типу, который имеет правильный размер. Вы указали только 2 байта в вашем примере, но вы читаете 4.

Для Visual Studio 2008, где int или long - это 4-байтовое целое число, вы можете просто сделать это:

int x = *reinterpret_cast<int*>(num_char);

Обратите внимание, что для большей переносимости вы должны использовать тип, который гарантированно будет 4 байта. В Visual C ++ вы можете использовать DWORD. Хотя предпочтительным решением будет использование int32_t из stdint.h , хотя это не доступно в Visual Studio до версии Visual Studio 2010.

Кроме того, вы не упоминаете, если ваш тип подписан или без знака, если он без знака, то используйте тип без знака.

0 голосов
/ 19 ноября 2010

atoi работает только для десятичных чисел.Вместо этого используйте strtol и передайте базовое значение 16 для преобразования шестнадцатеричных чисел:

x = strtol(num_char, NULL, 16);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...