Все остальные ответы - это варианты копирования памяти напрямую, но я думаю, что это неправильный подход. Это низкоуровневый, и вы используете язык высокого уровня, легко допустить ошибки, и это рискованно, если ваши записи содержат управляемые типы данных.
Если вы пытаетесь получить первые два байта одного элемента записи, попробуйте использовать вариант записи (на языке C, объединение.) Это раздел записи, который может быть адресовано несколькими способами, и здесь вы хотите обратиться к нему как к слову или серии байтов.
Попробуйте что-то вроде этого (не проверено, только что напечатано в редакторе SO):
type
TTwoBytes : packed record
ByteA, ByteB : Byte;
end;
TValueRecord : packed record:
case Boolean of
True: (Value: SmallInt);
False: (ValueBytes : TTwoBytes);
end;
end;
TMyRecord = packed record
Value1, Value2, Value3 : TValueRecord;
end;
Тогда для кода:
var
MyRecord: TMyRecord;
MyBytes: TTwoBytes;
begin
MyRecord := ...; // Fill it with data here
// Access the words / smallints by something like: MyRecord.Value1.Value
MyBytes := MyRecord.ValueBytes; // The key bit: type safe assignment
// Do something with MyBytes.ByteA or MyBytes.ByteB
end;
Что это дает вам лучше, чем прямое копирование памяти?
- Это безопасно: если у вас есть более сложные записи, содержащие строки, интерфейсы и т. Д., Он все равно будет работать, не нарушая счетчика ссылок.
- Это безопасный тип: нет прямого копирования памяти: вы и компилятор знаете, что у вас есть и используете.
- Это канонично: это, вероятно, «способ Дельфи». (Хотя есть несколько способов структурировать записи - если вы посмотрите в истории ответов, у меня изначально был худший вариант. Также я думаю, что синтаксис «
case ... of
» для этого глуп, но это другое обсуждение ... :))
Некоторые заметки: