我尝试将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 但我需要更多的2个值
EC 51
该功能应该归还给我
8B FF 55 8B EC 51
答案 0 :(得分:3)
我正在尝试为字节转换10位数的整数值,但该函数只返回4个值,我需要6个点,如何解决?
你做不到。 Integer
的大小只有4个字节。 Integer
值2337669003
是字节序列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.