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
値になります。5903246413051658240
00 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;