将整数转换为字节数组

Convert integer to array of bytes

我正在尝试将一个10位整数值转换为byte,但是该函数只有return给我4个值,我需要6个点,如何解决?

我正在使用以字节为单位转换整数的函数

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;

函数return是我

8B FF 55 8B

values that are returned 但我需要更多 2 个值

欧共体 51

函数应该return我

8B FF 55 8B 欧共体 51

correct value according to cheat engine

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

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.

您可以使用指令 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;

I'm trying to convert an integer value of 10 digits for byte, but the function only returns me 4 values, I need 6 points, how to solve?

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

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

从截图中我们可以清楚的看到字节序列8B FF 55 8B EC 51其实对应的是Win32BitBlt()函数的前4条x86汇编指令。为什么要使用整数值来表示汇编指令?这不是解决这个问题的好方法。你了解 x86 指令集的实际工作原理吗?你了解整数的工作原理吗?

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

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

  // push ebp
  Instructions[2] := ;

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

  // push ecx
  Instructions[5] := ;

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

或者甚至使用记录代替:

type
  BitBltInstructions = packed record
    MovEdiEdi: array[0..1] of byte; // B $FF
    PushEbp: byte; // 
    MovEbpEsp: array[0..1] of byte; // B $EC
    PushEcx: byte; // 
  end;

var
  Instructions: BitBltInstructions;
  bytes: array[0..Sizeof(BitBltInstructions)-1] of byte absolute Instructions;
  i: Integer;
begin
  Instructions.MovEdiEdi[0] := B;
  Instructions.MovEdiEdi[1] := $FF;
  Instructions.PushEbp      := ;
  Instructions.MovEbpEsp[0] := B;
  Instructions.MovEbpEsp[1] := $EC;
  Instructions.PushEcx      := ;

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