我正在尝试将 10 位的整数值转换为字节,但该函数只返回 4 个值,我需要 6 个点,如何解决?
你不能。AnInteger
的大小只有 4 个字节。该Integer
值2337669003
是字节序列8B FF 55 8B
。您无法从中获得额外的EC 51
字节。
AnInt64
大小为 8 个字节。字节序列8B FF 55 8B EC 51
将是其高 2 字节 ( ) 被截断的Int64
值。5903246413051658240
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] := $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;