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