为什么在 C++ 中字节数组中的字节是颠倒的

why are the bytes in byte array reversed in C++

我试图理解的代码覆盖了游戏进程内存的一部分(window.h,WriteProcessMemory)以修改游戏中的参数(例如强度)。这些值很可能是整数

代码尝试用这个函数替换

WriteProcessMemory( GameHandle, (BYTE*)StrengthMemoryAddress, &StrengthValue, sizeof(StrengthValue), NULL);

其中 StrengthMemoryAddress 是预先计算的动态地址,StrengthValue 如下:

byte StrengthValue[] = { 0x39, 0x5, 0x0, 0x0 };

用1337代替强度

我的问题基本上是字节数组在这个函数中是如何工作的。从 google 我知道 1337 的十六进制值为 0x539。

为什么要在字节数组中反转?我看到他首先放入 0x39,然后放入 0x5,我认为这可能以某种相反的顺序组合成 0x539。另外,为什么最后需要额外的 0x0 - 你不能把它去掉吗?

谢谢

from google i know that the hex value of 1337 is 0x539.

或者是 0x00000539 相同但写成 4 字节整数。现在,如果您在内存中以小端方式写入此整数,则必须按以下顺序存储它(最低有效字节 - 0x39 - 首先):

Memory Address   Values
1000             0x39  
1001             0x05
1002             0x00
1003             0x00

所以这与字节顺序有关。您可能想阅读有关该主题的更多信息。

您输入的数字必须采用 Little Endian 格式。我建议您阅读 Endianness

至于末尾的额外 0:您必须覆盖 int 的整个字节长度,否则您可能会留下旧值,这会破坏您正在编写的 int 的值.

您原以为 0x39 是最高字节 (Big Endian),但您最终得到的架构是最低字节 (Little Endian)。

从逻辑上看 int

[ BYTE 0 ][ BYTE 1 ][ BYTE 2 ][ BYTE 3 ]
 * 256^3    *256^2    *256       *1
  MSB                            LSB

但这并不意味着您所在的体系结构以这种方式映射 char 数组。事实上,它恰恰相反。

value [what you expected]  [what you got]
       BIG ENDIAN           LITTLE ENDIAN
0x39      BYTE 0              BYTE 3
0x05      BYTE 1              BYTE 2
0x00      BYTE 2              BYTE 1
0x00      BYTE 3              BYTE 0

如果您没有设置所有 4 个字节,那么丢失的字节将被称为 uninialized memory,并且通过您创建的 int 使用它被视为 undefined behavior。这可能只会在丢失的字节中留下一个意想不到的值(无论之前发生了什么),但编译器可以自由地做任何它想做的事,比如删除你认为会做某事的代码,从而导致非常意想不到的行为。