0
var Buffer: TMemoryStream

编码:

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

不幸的是,这是不可能的:运算符不适用于这种类型的操作数。

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

4

3 回答 3

5

您只能从字符指针中添加/减去整数。来自德尔福的帮助:

您可以使用 + 和 - 运算符来增加和减少字符指针的偏移量。您还可以使用 - 来计算两个字符指针的偏移量之间的差异。以下规则适用。

如果 I 是整数,P 是字符指针,则 P + I 将 I 添加到 P 给出的地址;也就是说,它返回一个指向 P 之后的地址 I 个字符的指针。(表达式 I + P 等价于 P + I。) P - I 从 P 给出的地址中减去 I;也就是说,它返回一个指向 P 之前的 I 个字符的地址的指针。这对于 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);
于 2009-07-27T10:15:51.987 回答
2

我认为带有 PByte 的原始代码应该可以在 Delphi 2009 中使用,因为它现在具有更多启用了指针数学的类型。

于 2009-07-27T10:25:42.107 回答
1

您正在将 Buffer.Memory 转换为 PByte 并希望添加一个 Int64 值。那是行不通的(Delphi 对指针的操作非常严格)。试试这个:

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);

这个“应该”在 Delphi 2009 中使用指针数学:

Move(PByte(Buffer.Memory)[Buffer.Position], Buffer.Memory^, Buffer.Size - Buffer.Position);
于 2009-07-27T10:13:45.907 回答