Правильный способ копирования данных из 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;