将整数转换为字节数组
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 个字节。 Integer
值 2337669003
是字节序列 8B FF 55 8B
。您无法从中获得额外的 EC 51
字节。
Int64
的大小为 8 个字节。字节序列 8B FF 55 8B EC 51
将是 5903246413051658240
的 Int64
值,其高 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;
我正在尝试将一个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
欧共体 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 个字节。 Integer
值 2337669003
是字节序列 8B FF 55 8B
。您无法从中获得额外的 EC 51
字节。
Int64
的大小为 8 个字节。字节序列 8B FF 55 8B EC 51
将是 5903246413051658240
的 Int64
值,其高 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;