Как я могу конвертировать TBytes в RawByteString? - PullRequest
5 голосов
/ 21 апреля 2009

Каков наилучший способ преобразования массива байтов, объявленных как TBytes, в RawByteString в Delphi 2009? Этот код на самом деле работает, может быть, есть более быстрый способ (без цикла):

   function Convert(Bytes: TBytes): RawByteString; 
   var
     I: Integer;
   begin
     SetLength(Result, Length(Bytes));
     for I := 0 to ABytes - 1 do
       Result[I + 1] := AnsiChar(Bytes[I]);
   end;

Ответы [ 4 ]

11 голосов
/ 07 августа 2010

Лучший способ это:

function Convert(const Bytes: TBytes): RawByteString; inline;
begin
  SetString(Result, PAnsiChar(pointer(Bytes)), length(Bytes));
end;

И не забывайте использовать const для байтовых параметров для более быстрого генерирования кода.

6 голосов
/ 26 апреля 2009

И не забудьте проверить:

ЕСЛИ Длина (в байтах)> 0 ТОГДА ПЕРЕМЕЩАТЬ .....

6 голосов
/ 22 апреля 2009

Вы можете рассмотреть возможность перемещения (не проверено)

function Convert(const Bytes: TBytes): RawByteString; 
begin
  SetLength(Result, Length(Bytes));
  Move(Bytes[0], Result[1], Length(Bytes))  
end;

И использовать «const» для параметра, чтобы массив не копировался дважды.

5 голосов
/ 02 июня 2009

Не забудьте назначить кодовую страницу для данных RawByteString, чтобы символьные данные были правильно преобразованы, если они когда-либо назначены любому другому типу String:

function Convert(const Bytes: TBytes): RawByteString; 
begin
  SetLength(Result, Length(Bytes));
  if Length(Bytes) > 0 then
  begin
    Move(Bytes[0], Result[1], Length(Bytes));
    SetCodePage(Result, ..., False);
  end;
end;
...