Delphi 2007,Indy 10.为什么我不能对TidBytes缓冲区进行类型转换?

时间:2015-03-26 19:32:23

标签: delphi memory delphi-2007 indy10

是否无法通过类型转换访问TidBytes缓冲区内存中的数据?说我有:

type
    TMyRecord = packed record
        Field1 : integer ;
        Field2 : packed array [0..1023] of byte ;
        end ;  

var
  Buffer    : TIdBytes ;
  MyRecord  : TMyRecord ;

begin
  IdTCPClient1.IOHandler.ReadBytes (Buffer, SizeOf (TMyRecord), false) ;

  with TMyRecord (Buffer) do            // compiler snags with "invalid typecast"
  ...

好的,我可以使用:

BytesToRaw (Buffer, MyRecord, SizeOf (TMyRecord)) ;

但没有办法直接访问数据而没有复制它的开销吗?

1 个答案:

答案 0 :(得分:3)

  

是否无法通过类型转换访问TidBytes缓冲区内存中的数据?

TIdBytes是一个动态数组字节,因此如果要以任何特定格式解释其原始字节,则必须使用类型转换。

  

没有办法直接访问数据而没有复制它的开销吗?

动态数组由编译器/ RTL实现为指向内存中其他位置分配的块的指针。因此,您可以使用指针类型转换来解释块的内容,例如:

type
  PMyRecord = ^TMyRecord;
  TMyRecord = packed record
    Field1 : integer ;
    Field2 : packed array [0..1023] of byte ;
  end ;  

var
  Buffer: TIdBytes ;
begin
  IdTCPClient1.IOHandler.ReadBytes (Buffer, SizeOf(TMyRecord), false) ;
  with PMyRecord(Buffer)^ do
    ...
end;