-5

10 桁の整数値をバイトに変換しようとしていますが、関数は 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;

関数は私を返します

8B FF 55 8B

返される値ですが ここに画像の説明を入力 、さらに2つの値が必要です

EC51

関数は私を返す必要があります

8B FF 55 8B EC 51

チートエンジンによる正しい値

ここに画像の説明を入力

4

3 に答える 3

4

10 桁の整数値をバイトに変換しようとしていますが、関数は 4 つの値しか返しません。6 ポイントが必要です。解決方法を教えてください。

できません。An のIntegerサイズはわずか 4 バイトです。Integer値は2337669003バイト シーケンス8B FF 55 8Bです。EC 51そこから余分なバイトを取得する方法はありません。

An のInt64サイズは 8 バイトです。バイト シーケンス8B FF 55 8B EC 51は、上位 2 バイト ( ) が切り捨てられた のInt64値になります。590324641305165824000 00

スクリーンショットから、バイト シーケンスが Win32関数8B FF 55 8B EC 51の最初の 4 つの x86 アセンブリ命令に実際に対応していることがはっきりとわかります。BitBlt()アセンブリ命令を表すために整数値を使用しているのはなぜですか? これは良い方法ではありません。x86命令セットが実際にどのように機能するか理解していますか? 整数の仕組みを理解していますか?

この状況では、整数配列の代わりに実際のバイト配列を使用することをお勧めします。

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;

または、代わりにレコードを使用することもできます:

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

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

  for i := Low(bytes) to High(bytes) do
    Memo1.Lines.Append(IntToHex(bytes[i], 2));
end;
于 2016-05-25T19:02:20.880 に答える
1

ディレクティブを使用できます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;
于 2016-05-25T13:20:57.150 に答える
-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.
于 2016-05-25T11:24:50.000 に答える