我正在尝试访问程序的内存,以便将十进制输入转换为二进制输出。我目前正在尝试做的是使用@input访问我的整数的起始地址,然后每次将地址递增1并将该地址的值写入控制台。
例如:
有人可以给我一些关于如何做到这一点的提示(或指示?哈哈)?感谢。
答案 0 :(得分:2)
我不是百分百肯定我明白你在问什么。
您可以使用这样的函数将值转换为二进制表示形式,取自Indy单元IdGlobalProtocols
。
function IntToBin(Value: LongWord): string;
var
i: Integer;
begin
SetLength(Result, 32);
for i := 1 to 32 do begin
if ((Value shl (i-1)) shr 31) = 0 then begin
Result[i] := '0'
end else begin
Result[i] := '1';
end;
end;
end;
另一方面,也许您只是想问一下如何将地址增加一个。好吧,获取地址并添加一个。有两种方法可以做到这一点。如果要将地址作为数字处理,请将其转换为指针大小的整数:
var
Address: UIntPtr;
....
Address := UIntPtr(@someVar);
现在你可以进行算术了。例如:
inc(Address);
Address := Address + 8;
等等。
如果您确实希望执行指针运算然后取消引用指针,则更容易使用指针类型。所以,如果你想挑选字节,那么你可以这样做:
var
BytePtr: PByte;
....
BytePtr := PByte(@someVar);
现在你可以用
读取一个字节b := BytePtr^;
下一个是:
inc(BytePtr);
b := BytePtr^;
最后,如果你想拉出构成整数的字节,那么就有LongRec
类型。写LongRec(someIntVar).Bytes[i]
以读取构成整数的4个字节之一。存在类似的记录WordRec
和Int64Rec
。这些类型在SysUtils
。