[英]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
。 这很可能会在丢失的字节中留下一个意外的值(无论之前发生了什么),但是编译器可以自由地执行所需的任何操作,例如删除您认为会做些事情的代码,从而导致非常意外的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.