2009-07-27 82 views
0
var Buffer: TMemoryStream 

代码:添加指针

Move((PByte(Buffer.Memory)+Buffer.Position)^, Buffer.Memory^, Buffer.Size - Buffer.Position); 

不幸的是这是不可能的:操作并不适用于这种类型的操作数。

那么我怎样才能得到一个MemoryBuffer的起点呢?

+0

什么是Buffer的定义? – sharptooth 2009-07-27 09:31:01

回答

5

只能加/减整数字符指针。从德尔福帮助:

您可以使用+和 - 运营商 增量和 一个字符指针递减的偏移量。您也可以使用 - 计算两个字符指针的偏移量之间的差异。 适用以下规则。

如果我是一个整数并且P是一个 字符指针,那么P + I将I 加到P给出的地址上;也就是它 返回一个指向P.之后的地址I 个字符的指针(表达式I + P等于P + I。)P-I从 P给出的地址减去I;也就是说,它返回一个指向 指针前的地址I字符。012h这对PChar指针是正确的;对于 PWideChar指针P + I增加 一下SizeOf(WideChar)至P.

如果P和Q都是字符 指针,那么P - Q计算由P(高位地址)给定 的地址之间的差 和Q给出的 地址(地址较低的 地址);也就是说,它返回一个 整数,表示P和Q之间的字符数 。P + Q为 未定义。

试试这个:

Move((PAnsiChar(Buffer.Memory)+Buffer.Position)^, Buffer.Memory^, Buffer.Size - Buffer.Position); 
+4

使用PAnsiChar,而不是PChar,以免下次升级Delphi时,代码突然出现奇怪的错误。 – 2009-07-27 14:57:13

1

您铸造Buffer.Memory到PBYTE,想添加一个Int64值。这是行不通的(德尔福是非常严格的,你用指针做什么)。试试这个:

Move(Pointer(Int64(Buffer.Memory)+Buffer.Position)^, Buffer.Memory^, Buffer.Size - Buffer.Position); 

这个工程:

Move(PAnsiChar(Buffer.Memory)[Buffer.Position], Buffer.Memory^, Buffer.Size - Buffer.Position); 

这 “应该” 在2009年德尔福与POINTERMATH工作:

Move(PByte(Buffer.Memory)[Buffer.Position], Buffer.Memory^, Buffer.Size - Buffer.Position); 
+0

后一个例子只有在内存的类型是PByte时才有效。它不是'指针'吗? – 2009-07-27 14:58:42

+0

我向PByte添加了一个转换,但是不可能只使用指针? – 2009-07-27 19:02:33

2

我认为,原代码与PBYTE应在2009年德尔福工作,因为它现在有更多类型的启用指针数学。