为什么字节数组中的字节在C ++中被反转

时间:2015-08-27 14:13:17

标签: c++ byte bytearray endianness

我试图理解的代码覆盖了游戏进程内存的一部分(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 - 你不能把它留下来吗?

感谢

3 个答案:

答案 0 :(得分:8)

  来自Google的

我知道1337的十六进制值是0x539。

或者它是0x00000539,它是相同的,但写为4字节整数。现在,如果你在内存中以小端方式写这个整数,你必须按照以下顺序存储它(最低有效字节 - 0x39 - 先行):

WITH Temp AS
  (
    SELECT GroupProductRelationSorting 
    FROM EcomGroupProductRelation 
    WHERE GroupProductRelationProductID = 'PROD7'
  ) 


SELECT GroupProductRelationProductID
FROM 
  (
    SELECT
      GroupProductRelationProductID,
      ROW_NUMBER() OVER (PARTITION BY GroupProductRelationGroupID ORDER BY GroupProductRelationSorting) AS RN
    FROM 
      EcomGroupProductRelation 
       INNER JOIN 
      EcomProducts ON 
        GroupProductRelationProductID = ProductID
    WHERE 
      ProductActive = 1 AND 
      GroupProductRelationSorting > (SELECT GroupProductRelationSorting FROM Temp)
  ) x
 WHERE RN = 1 

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

答案 1 :(得分:1)

您期望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。这可能只会在丢失的字节中留下一个意外的值(无论之前发生过什么),但编译器可以自由地做任何想做的事情,比如删除你认为会做某事的代码,导致你出乎意料的行为。 / p>

答案 2 :(得分:0)

您所写的数字必须采用Little Endian格式。我建议您在其他Endianess上阅读sites

至于最后的额外0:你必须覆盖int的整个字节长度,否则你将冒险留下旧值,这会损坏你正在编写的int的值。< / p>