2015-03-26 3 views
0

Невозможно ли получить доступ к данным в памяти буфера TidBytes с приведением типов? Скажем, у меня есть:Delphi 2007, Indy 10. Почему я не могу выбрать тип буфера 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)) ; 

, но не существует никакого способа доступа к данным непосредственно без накладных расходов на копирование его?

ответ

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; 
+0

Thanks Remy. Я пробовал все комбинации, которые я мог бы использовать, используя '^', 'addr' и' TMyRecord', я не думал, чтобы попытаться определить тип указателя. Кстати, если первое слово вашего ответа будет * Да *, а не * Нет *? – rossmcm

+0

Вы спрашивали, можно ли получить доступ к данным без приведения типов, а этот ответ - * Нет *. Но я повторил ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^