C++/CPP 读取添加的十六进制地址
C++/CPP Reading an added hex address
我对 CPP 还是比较陌生,但我找不到任何有我问题的来源。我的 IDE 是 MSVC 2017 预览版,我想要的结果是将两个十六进制地址相加,然后读取地址的值。我不确定为什么,但它不能很好地添加十六进制数字。我会给你我现在的例子:
int number;
ReadProcessMemory(pHandle, (void*)(0x37c90000 + 0xE29FE8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x37c90000 + 0xE29FE8) << std::endl;
ReadProcessMemory(pHandle, (void*)(0x38ab9fe8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
std::cout << "a = " << (0x37c90000 + 0xE29FE8) << std::endl;
std::cout << "b = " << (0x38ab9fe8) << std::endl;
我对这段代码的预测结果是,两个 ReadProcessMemory 应该得到完全相同的值,但只有第二个 ReadProcessMemory(已经添加了十六进制值)returns 正确。
此外,计算 A 和 B 报告完全相同的地址。如果是这样,为什么 ReadProcessMemory 在第一个 ReadProcessMemory 上发脾气并报告负数?
这是我使用上面的代码得到的结果:
-331287296 for 38ab9fe8
ec40f500 for 38ab9fe8
a = 38ab9fe8
b = 38ab9fe8
抱歉,但我真的不明白为什么它们有任何不同。
不,这似乎是正确的。 0xec40f500
是十进制有符号值 -331287296
的无符号十六进制表示。请了解 two's complement 负数的表示法。
我认为问题是 std::hex
manipulator,即 粘性 。如果您在第二种情况下使用 std::dec
两个数字将显示为十进制:
// Second output
std::cout << std::dec << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
// ^^^^^^^^
// Display *all* following numbers as decimal
或者在第一个输出中使用std::hex
:
// First output
std::cout << std::hex << number << " for " << (0x37c90000 + 0xE29FE8) << std::endl;
// ^^^^^^^^
// Display *all* following numbers as hexadecimal
当然,如果你打算number
是无符号的,你需要在定义变量时明确说明。也许你会更容易看到 0xec40f500
和 unsigned 十进制值 3963680000
?
之间的联系
我对 CPP 还是比较陌生,但我找不到任何有我问题的来源。我的 IDE 是 MSVC 2017 预览版,我想要的结果是将两个十六进制地址相加,然后读取地址的值。我不确定为什么,但它不能很好地添加十六进制数字。我会给你我现在的例子:
int number;
ReadProcessMemory(pHandle, (void*)(0x37c90000 + 0xE29FE8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x37c90000 + 0xE29FE8) << std::endl;
ReadProcessMemory(pHandle, (void*)(0x38ab9fe8), &number, sizeof(number), 0);
std::cout << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
std::cout << "a = " << (0x37c90000 + 0xE29FE8) << std::endl;
std::cout << "b = " << (0x38ab9fe8) << std::endl;
我对这段代码的预测结果是,两个 ReadProcessMemory 应该得到完全相同的值,但只有第二个 ReadProcessMemory(已经添加了十六进制值)returns 正确。
此外,计算 A 和 B 报告完全相同的地址。如果是这样,为什么 ReadProcessMemory 在第一个 ReadProcessMemory 上发脾气并报告负数?
这是我使用上面的代码得到的结果:
-331287296 for 38ab9fe8
ec40f500 for 38ab9fe8
a = 38ab9fe8
b = 38ab9fe8
抱歉,但我真的不明白为什么它们有任何不同。
不,这似乎是正确的。 0xec40f500
是十进制有符号值 -331287296
的无符号十六进制表示。请了解 two's complement 负数的表示法。
我认为问题是 std::hex
manipulator,即 粘性 。如果您在第二种情况下使用 std::dec
两个数字将显示为十进制:
// Second output
std::cout << std::dec << number << " for " << std::hex << (0x38ab9fe8) << std::endl;
// ^^^^^^^^
// Display *all* following numbers as decimal
或者在第一个输出中使用std::hex
:
// First output
std::cout << std::hex << number << " for " << (0x37c90000 + 0xE29FE8) << std::endl;
// ^^^^^^^^
// Display *all* following numbers as hexadecimal
当然,如果你打算number
是无符号的,你需要在定义变量时明确说明。也许你会更容易看到 0xec40f500
和 unsigned 十进制值 3963680000
?