Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Передача бинарных данных в Delphi XE2 без конвертации в Unicode

Delphi , Синтаксис , Типы и Переменные

Вопрос, рассмотренный в данной статье, касается передачи бинарных данных в среде разработки Delphi XE2, в частности, в виде массива байтов, который необходимо разместить в объекте Variant без конвертации в Unicode. Это может быть актуально, например, при работе с сервером DataSnap, где необходимо обеспечить эффективную передачу данных между клиентским приложением и сервером.

Проблема

При использовании следующего кода в Delphi XE2:

function PrepData(StrVal: string; Base64Val: AnsiString): OleVariant;
begin
  Result := VarArrayCreate([0, 1], varVariant);
  Result[0] := StrVal;
  Result[1] := Base64Val;
end;

где Base64Val представляет собой бинарные данные, закодированные в Base64, и не содержит символов null, передача данных происходит в виде Unicode-строк. Это приводит к нежелательной конвертации данных в Unicode, что может быть неэффективно или даже недопустимо в некоторых случаях. Автор вопроса ищет способ избежать этой конвертации для Base64Val.

Решение

Известно, что в Delphi для хранения строк в объекте Variant используются специальные коды типов, такие как varString и varUString для ShortString и UnicodeString соответственно. Однако, для передачи бинарных данных без конвертации в Unicode, необходимо использовать массив байтов.

Рассмотрим следующий пример кода:

function PrepData(StrVal: string; Data: TBytes): OleVariant;
var
  SafeArray: PVarArray;
begin
  Result := VarArrayCreate([0, 1], varVariant);
  Result[0] := StrVal;
  Result[1] := VarArrayCreate([1, Length(Data)], varByte);
  SafeArray := VarArrayAsPSafeArray(Result[1]);
  Move(Pointer(Data)^, SafeArray.Data^, Length(Data));
end;

В этом примере создается массив байтов Result[1] вместо использования AnsiString. Затем данные из массива Data копируются непосредственно в массив байтов SafeArray.

На стороне сервера DataSnap данные можно извлечь следующим образом:

procedure GetBinaryData(Value: Variant; Result: TMemoryStream);
var
  SafeArray: PVarArray;
begin
  SafeArray := VarArrayAsPSafeArray(Value);
  Assert(SafeArray.ElementSize = 1);
  Result.Clear;
  Result.WriteBuffer(SafeArray.Data^, SafeArray.Bounds[0].ElementCount);
end;

Этот метод позволяет избежать конвертации в Unicode и передать бинарные данные напрямую.

Заключение

В данной статье мы рассмотрели, как избежать конвертации бинарных данных в Unicode при их передаче в объекте Variant в Delphi XE2. Использование массива байтов вместо AnsiString позволяет эффективно передавать бинарные данные между клиентом и сервером DataSnap без нежелательной конвертации.

Создано по материалам из источника по ссылке.

Передача бинарных данных в среде Delphi XE2 без их конвертации в Unicode, используя объекты `Variant` для эффективной работы с сервером DataSnap.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Типы и Переменные ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 09:33:48/0.0059869289398193/0