Delphi 指针强制类型转换

Delphi 指针强制类型转换,第1张

我是刚刚学delphi,这种转换还可以这样做(也许别人也会用到,能想到强制转换的估计都是做C过来的吧)

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、或者里面隐含处理的长度,这样的写法不安全,可能会造成未知的错误,或让程序崩溃!


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/60440.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-02-27
下一篇2023-02-27

发表评论

登录后才能评论

评论列表(0条)

    保存