繁体   English   中英

为什么字节数组中的字节在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代替了强度

我的问题基本上是字节数组在此函数中的工作方式。 从谷歌我知道1337的十六进制值为0x539。

为什么要在字节数组中将其反转? 我看到他先放0x39,然后放0x5,我得出的结论可能是以相反的顺序组合到0x539。 另外,为什么您最后需要额外的0x0-难道不就把它遗漏了吗?

谢谢

从谷歌我知道1337的十六进制值为0x539。

或等于0x00000539,但写为4字节整数。 现在,如果您以小尾数法将此整数写入内存,则必须按以下顺序存储它(最低有效字节-0x39-首先):

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

因此,这与字节序有关。 您可能需要阅读更多有关该主题的信息。

您原本以为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使用创建的uninialized memory将被视为undefined behavior 这很可能会在丢失的字节中留下一个意外的值(无论之前发生了什么),但是编译器可以自由地执行所需的任何操作,例如删除您认为会做些事情的代码,从而导致非常意外的行为。

您输入的数字必须为Little Endian格式。 我建议您在其他一些网站上阅读Endianess

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM