program Project1
{$APPTYPE CONSOLE}
uses
SysUtils
type
PInteger = ^Integer
var
pCh: ^AnsiChar
I: Integer
pI: ^Integer
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
I := 257
pCh := @I
pI := Pointer(pCh)
WriteLn(Integer(pCh^))
WriteLn(pI^)
ReadLn
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message)
end
end.
编译通得过,Pointer,pByte,Cardinal都可以直接用,p开头的一般是一些指针类。p:Pointer :定义P为一般性通用的指针,可以作为任何类型数据的指针
tb1:=pByte(p)^把p强制转换为字节指针(它所指向的数据仅占一个字节),并把指针地址所指向的内容(Byte类型)传给tb1
tb2:=pByte(Ptr(Cardinal(p)+1))^把P指针的地址转换为一个无符号整数,并且把这个整数加1,然后再转换为指针,再转换为字节指针,再把内容传给tb2
tb3:=pByte(Ptr(Cardinal(p)+2))^原理同上
tb4:=pByte(Ptr(Cardinal(p)+3))^
pByte(p)^:=tb4把p强制转换为字节指针,并把指针地址所指向的地方放入TB4
pByte(Ptr(Cardinal(p)+1))^:=tb3原理同上
pByte(Ptr(Cardinal(p)+2))^:=tb2
pByte(Ptr(Cardinal(p)+3))^:=tb1
整个句子看下来,就是把P所指向连续四个字节的内存信息内容刚好反转过来,
比如:
地址:数据
[p+0]:0A
[p+1]:0B
[p+2]:0C
[p+3]:0D
现在:
[p+0]:0D
[p+1]:0C
[p+2]:0B
[p+3]:0A
我觉得你应该先搞清楚WriteBuffer写入的时候是按照多少字节写入的,也就是说是1字节、2字节还是其它。一般如果仅仅是内存区域的话,我觉得按1字节的可能性最大,这样就存在问题了,你定义的是bufBit: Array of IntegerInteger在Delphi中是4字节的,你要是转化的话建议转化为Byte指针比较好:
var
BP: PByte
begin
BP:= PBYTE(@BufBit[0])
//处理部分
end
呵呵,未验证,仅供参考
另外,一楼所说很有道理!
1、看你WriteBuffer的写法似乎是为了和C语法兼容,未指定长度的话可能会以 0 作为结束符,需要注意。
2、或者里面隐含处理的长度,这样的写法不安全,可能会造成未知的错误,或让程序崩溃!
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)