将整数转换为字节数组

时间:2016-05-25 11:18:14

标签: arrays delphi cheat-engine

我尝试将10位数的整数值转换为字节,但该函数只返回4个值,我需要6个点,如何解决?

函数I用于转换整数字节

var
  i, j: integer;
  bbI : array[1.. sizeof(integer)] of byte;
begin
  i := 2337669003;
  Move(i, bbI[1], SizeOf(Integer));
  for j := Low(bbI) to High(bbI) do
  Memo1.Lines.Append(IntToHex(bbI[j],2))
end;

该函数返回我

8B FF 55 8B

values that are returned enter image description here 但我需要更多的2个值

EC 51

该功能应该归还给我

8B FF 55 8B EC 51

correct value according to cheat engine

enter image description here

3 个答案:

答案 0 :(得分:3)

  

我正在尝试为字节转换10位数的整数值,但该函数只返回4个值,我需要6个点,如何解决?

你做不到。 Integer的大小只有4个字节。 Integer2337669003是字节序列8B FF 55 8B。你无法从中获得额外的EC 51个字节。

Int64的大小为8个字节。字节序列8B FF 55 8B EC 51的{​​{1}}值为Int64,其高2字节(5903246413051658240)被截断。

从屏幕截图中,我们可以清楚地看到字节序列00 00实际上对应于Win32 8B FF 55 8B EC 51函数的前4 x86汇编指令。为什么使用整数值来表示汇编指令?这不是解决这个问题的好方法。你明白x86指令集是如何工作的吗?你了解整数是如何工作的吗?

在这种情况下,我建议使用实际的字节数组而不是整数数组:

BitBlt()

甚至可以改为使用记录:

var
  Instructions: array[0..5] of byte;
  i: Integer;
begin
  // mov edi,edi
  Instructions[0] := $8B;
  Instructions[1] := $FF;

  // push ebp
  Instructions[2] := $55;

  // mov ebp,esp
  Instructions[3] := $8B;
  Instructions[4] := $EC;

  // push ecx
  Instructions[5] := $51;

  for i := Low(Instructions) to High(Instructions) do
    Memo1.Lines.Append(IntToHex(Instructions[i], 2));
end;

答案 1 :(得分:0)

您可以使用指令absolute

procedure Main;
var
  i: Integer;
  x: array[0..3] of Byte absolute i;
begin
  i := 123456;
  Writeln(x[0]);
  Writeln(x[1]);
  Writeln(x[2]);
  Writeln(x[3]);
end;

答案 2 :(得分:-1)

您使用变体记录。在这种情况下,记录的两个字段共享相同的内存:

program Test;
uses
  System.SysUtils;

type
  TInteger = record
    case Byte of
      0: (AsValue: Integer);
      1: (AsArray: array [0..3] of Byte);
  end;

var
  X: TInteger;
begin
  X.AsValue := 123456;
  Writeln(X.AsArray[0]);
  Writeln(X.AsArray[1]);
  Writeln(X.AsArray[2]);
  Writeln(X.AsArray[3]);
end.