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

Delphi 2007, Indy 10. Why can't I typecast a TidBytes buffer?

是否无法通过类型转换访问 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)) ;

但是没有复制数据的开销就没有直接访问数据的方法吗?

Is it not possible to access the data in the memory of a TidBytes buffer with typecasting?

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

is there no way of accessing the data directly without the overhead of copying it?

动态数组 由compiler/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;