Мне нужно отправить из Windows на мобильные устройства, iOS и Android по протоколу TCP, большую строку Base64.
У меня нет проблем с отправкой и получением, но размер строк слишком велик, около 24000 символов, и я ищу способ сжатия распаковки этих строк.
Глядя, я вижу, что лучший способ - использовать Zlib, и я нашел ссылку Delphi XE and ZLib Problems (II), в которой объясняется, как это сделать.
Функции работают с обычной текстовой строкой, но сжатие строк base64 делает их более большими.
Пример очень маленькой строки, я послал бы, был бы это:
Сжатие Base64 строка с zlib
cEJNYkpCSThLVEh6QjNFWC9wSGhXQ3lHWUlBcGNURS83TFdDNVUwUURxRnJvZlRVUWd4WEFWcFJBNUZSSE9JRXlsaWgzcEJvTGo5anQwTlEyd1pBTEtVQVlPbXdkKzJ6N3J5ZUd4SmU2bDNBWjFEd3lVZmZTR1FwNXRqWTVFOFd2SHRwakhDOU9JUEZRM00wMWhnU0p3MWxxNFRVdmdEU2pwekhwV2thS0JFNG9WYXRDUHhTdnp4blU5Vis2ZzJQYnRIdllubzhKSFhZeUlpckNtTGtUZHVHOTFncHVUWC9FSTdOK3JEUDBOVzlaTngrcEdxcXhpRWJ1ZXNUMmdxOXpJa0ZEak1ORHBFenFVSTlCdytHTy ==
Я не знаю, если это Возможное сжать эти типы строк. Мне нужна помощь.
Функции, которые я использую это:
uses
SysUtils, Classes, ZLib, EncdDecd;
function CompressAndEncodeString(const Str: string): string;
var
Utf8Stream: TStringStream;
Compressed: TMemoryStream;
Base64Stream: TStringStream;
begin
Utf8Stream := TStringStream.Create(Str, TEncoding.UTF8);
try
Compressed := TMemoryStream.Create;
try
ZCompressStream(Utf8Stream, Compressed);
Compressed.Position := 0;
Base64Stream := TStringStream.Create('', TEncoding.ASCII);
try
EncodeStream(Compressed, Base64Stream);
Result := Base64Stream.DataString;
finally
Base64Stream.Free;
end;
finally
Compressed.Free;
end;
finally
Utf8Stream.Free;
end;
end;
function DecodeAndDecompressString(const Str: string): string;
var
Utf8Stream: TStringStream;
Compressed: TMemoryStream;
Base64Stream: TStringStream;
begin
Base64Stream := TStringStream.Create(Str, TEncoding.ASCII);
try
Compressed := TMemoryStream.Create;
try
DecodeStream(Base64Stream, Compressed);
Compressed.Position := 0;
Utf8Stream := TStringStream.Create('', TEncoding.UTF8);
try
ZDecompressStream(Compressed, Utf8Stream);
Result := Utf8Stream.DataString;
finally
Utf8Stream.Free;
end;
finally
Compressed.Free;
end;
finally
Base64Stream.Free;
end;
end;
Я бы предположил, что наиболее эффективным подходом было бы преобразование из UTF-16 в UTF-8, а затем сжатие байтов UTF-8. Если вам нужно передать текст, base64 сжатые байты UTF-8. Сжатый текст base64 звучит неправильно. –
Btw, нет XE10. Вы используете 10.1 Берлин. Я исправил текст и теги. Приятно точно указать версию. –
Спасибо @DavidHeffernan за ответ, но, извините, я не понимаю, как я это делаю. – elcharlie