Правильный способ копирования данных из TBytes в массив байтов в Delphi

учитывая следующее:

LBytes: TBytes;
LArr: array[1..512] of Byte;
...
SetLength(LBytes, 512);

каков правильный вызов Move () для копирования всех байтов из LBytes в LArr?

Move(LBytes[0], LArr, Length(LBytes)); // works

Move(LBytes[0], LArr[1], Length(LBytes)); // works, too

Move(LBytes, LArr[1], Length(LBytes)); // fail

может кто-нибудь объяснить, почему нет разницы между использованием Larr и Larr[1], но есть разница между LBytes[0] и LBytes?

1 ответов


может кто-нибудь объяснить, почему нет разницы между использованием Larr и Larr1 но делает разницу между LBytes[0] и LBytes?

потому что LBytes динамический массив, который, в конечном счете, указатель на массив. С другой стороны,--5--> массив.

другой способ сказать, что динамические массивы являются ссылочными типами, а массивы фиксированной длины-типами значений.

в моей книге, есть два эффективные способы сделать это:

Assert(Length(LBytes)<=Length(LArr));
Move(LBytes[0], LArr, Length(LBytes));

или

Assert(Length(LBytes)<=Length(LArr));
Move(Pointer(LBytes)^, LArr, Length(LBytes));

Я предпочитаю последний, потому что он устойчив к массиву нулевой длины, когда включена проверка диапазона. В этом случае первый блок кода приводит к ошибке проверки диапазона времени выполнения.

вы также можете быть мотивированы, чтобы избежать такого низкого уровня обмана. У меня есть служебный класс это позволяет мне написать:

TArray.Move<Byte>(LBytes, LArr);

подпись метода:

class procedure Move<T>(const Source: array of T; var Dest: array of T); overload; static;