Бинарный формат пакетов TClientDataset

=== Midas/DataSnap packet format (*.cds) ===
Offset 	Size (bytes)	Content
0 	4 	Signature = [$96, $19, $E0, $BD] - Сигнатура пакета MIDAS/DataSnap
4 	4 	Int32, обычно равно 1
8 	4 	Int32, обычно равно 18
12 	2 	FieldCount: UInt16 - количество полей
14 	4 	RecordCount: Int32 - количество записей в пакете
18 	4 	Int32, обычно равно 3
22 	2 	HeaderSize: UInt16 - вероятно, размер всего заголовка включая описания полей и свойств.
24 	X 	FieldList: FieldList - Структура описания полей.
X + 24 	2 	DSPropCount: UInt16 - количество свойств
X + 26 	Y 	DSProps: Prop[DSPropCount] - свойства набора.
HeaderSize	Varing 	RecordList: RecordList - данные записей.
=== Описание полей (FieldList) ===
Последовательный список из одинаковых описателей поля приведенных ниже. Количество в списке задано соответствующим значением заголовка.
 array [0..FieldCount - 1] of
Offset 	Size (bytes)	Content
0 	1 	Len: UInt8 - Длина имени поля
1 	Len 	FieldName: Char[Len] - Имя поля
Len + 1	2 	FieldSize: Int16, для строк - длина фиксированной части, те размера
Len + 3	2 	FieldType: Int16
Len + 5	2 	FieldAttrs: Int16 - атрибуты (флаги) поля.
Len + 7	2 	FieldPropCount: UInt16 - количество свойств поля
Len + 9	P 	FieldProps: Prop[FieldPropCount] - свойства поля.
=== Описание свойства (Prop) ===
Offset 	Size (bytes)	Content
0 	1 	Len: UInt8 - Длина имени свойства
1 	Len 	PropName: Char[Len] - Имя свойства
Len+1 	2 	PropSize: Int16
Len+3 	2 	PropType: Int16 (FieldType)
Len + 4	PropSize 	Data: Byte[PropSize] - Данные свойства
=== Описание записей (RecordList) ===
Последовательный список описателей записи, приведенных ниже. Количество в списке задано соответствующим значением заголовка.
 array [0..RecordCount - 1] of
Offset	Size (bytes)	Content
0 	1 	RecordStatus: UInt8
1 	S 	StatusBits: Byte[FieldCount / 4] - на каждое поле в массиве статусных битов отводится 2 бита от младшего к старшему. Данные полей содержащих Null или NotChanged в запись не попадают.
BLANK_NULL = 1; { 'real' NULL }
BLANK_NOTCHANGED = 2; { Not changed , compared to original value }
S+1 	X 	FieldData[] - пишутся только not null & changed значения.
Для полей фиксированного размера: FixedFieldData = Byte[FieldSize]
Для полей переменного размера: VarFieldData = (DataLen: UInt(of FieldSize)) Byte[DataLen] - те обычно данные предваряются 1-2 байтами размера.
=== FieldType ===
 dsfldUNKNOWN = 0; { Unknown }
 dsfldINT = 1; { signed integer }
 dsfldUINT = 2; { Unsigned integer }
 dsfldBOOL = 3; { Boolean }
 dsfldFLOATIEEE = 4; { IEEE float }
 dsfldBCD = 5; { BCD }
 dsfldDATE = 6; { Date (32 bit) }
 dsfldTIME = 7; { Time (32 bit) }
 dsfldTIMESTAMP = 8; { Time-stamp (64 bit) }
 dsfldZSTRING = 9; { Multi-byte string }
 dsfldUNICODE = 10; { unicode string }
 dsfldBYTES = 11; { bytes }
 dsfldADT = 12; { ADT (Abstract Data Type) }
 dsfldARRAY = 13; { Array type (not attribute) }
 dsfldEMBEDDEDTBL = 14; { Embedded (nested table type) }
 dsfldREF = 15; { Reference }
 
 MaskFieldType = $3F; { mask to retrieve Field Type }
 MaskVaryingFld = $40; { Varying attribute type. }
 MaskArrayFld = $80; { Array attribute type. } - Данные массива предваряются длиной Len: Int32, за которой следуют его элементы Data[Len].
 
=== Атрибуты поля (FieldAttrs) ===
 fldAttrHIDDEN = $0001; { Field is hidden }
 fldAttrREADONLY = $0002; { Field is readonly }
 fldAttrREQUIRED = $0004; { Field value required }
 fldAttrLINK = $0008; { Linking field }
=== Свойства поля (FieldProps) ===
 WIDTH: UInt16 - для полей переменного размера, например строк, равно Field.Size. Те это предельный размер данных, хранимых в поле.
=== Свойства набора (DataSetProps) ===
 CHANGE_LOG: UInt32[] - массив из целых чисел.
 DATASET_DELTA: UInt32 = 1, если в пакете передается delta-набор (набор изменений).
=== Статус записи (RecordStatus) ===
 dsRecUnmodified = $0000; { Unmodified record }
 dsRecOrg = $0001; { Original record (was changed) }
 dsRecDeleted = $0002; { Record was deleted }
 dsRecNew = $0004; { Record was inserted }
 dsRecModified = $0008; { Record was changed }
 dsUnused = $0020; { Record not used anymore (hole) }
 dsDetUpd = $0040; { Detail modification Ins/Del/Mod. }{ Can be combined with other status. }
Source: https://alexeevd.narod.ru/papers/cds_format.htm