Difference between revisions of "StreamCompress"

From SunFlurry wiki
Jump to: navigation, search
1>Admin
(Примеры)
 
m (1 revision imported)
 
(No difference)

Latest revision as of 11:38, 18 November 2022

  StreamCompress (Функции архивации)
Объект:Функции общего назначения
Статус разработки: Частичная реализация
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число, неверный аргумент, внешняя ошибка
Визуальность:Нет

Функция производит упаковку блока данных по заданному алгоритму. Для последовательной упаковки частей одного большого блока данных, функцию необходимо вызвать несколько раз с каждой частью блока данных. При работе с упаковкой и особенно с распаковкой данных, при некорректных аргументах функции можно получить порчу памяти, поэтому, нужно быть внимательным при написании программ и всегда их проверять.

Синтаксис

StreamCompress(<Данные для упаковки (STRING,BUFFER,TEXT)>,<Алгоритм (STRING)>="ZLIB",<Уровень (INT)>=6,<Завершающий блок (INT)>=1,<Словарь упаковки>):<Результат упаковки (STRING,BUFFER)>

Аргументы

  • <Данные для упаковки (STRING,BUFFER,TEXT)> - Функция поддерживает получение информации из строк, буферов или текста. Важно: если строка или текст закодированы в юникоде, функция не выполняет перекодирования данных в ANSI, будет происходить упаковка UTF-16 данных.
  • <Алгоритм (STRING)> - (необязательный аргумент) Строка, задающая используемый алгоритм. Поддерживаются следующие алгоритмы:
    • ZLIB (по умолчанию): Упаковка будет происходить методом Deflate с добавление заголовка Zlib. Обычно файлы, упакованные подобным образом, не поддерживаются архиваторами из-за простого нестандартного заголовка. Преимущества этого метода в том, что при распаковке не требуется указывать полный размер упакованного файла до начала распаковки.
    • GZIP или GZ: Упаковка будет происходить методом Deflate с добавление заголовка Gzip. Полученный массив данных можно будет распаковать стандартными средствами архивации. Минусом этого метода по сравнению с Zlib является то, что при распаковке требуется указывать полный размер упакованного файла до начала распаковки.
  • <Уровень (INT)> - (необязательный аргумент) Указывает уровень сжатия при упаковке. Аргумент может принимать значения от 0 до 9. При этом 0 -- не сжимать вообще, 9 -- максимальное сжатие. Уровень 6 используется по умолчанию. Для методов Deflate, уровни выше 6 будут занимать большее время при упаковке при этом не давать весомой выгоды по размеру результата.
  • <Завершающий блок (INT)> - (необязательный аргумент) Указывает на то, что это последний блок в серии блоков для упаковки. При упаковке большого блока частями важно, чтобы вызов с аргументом равным 1 был последним и единственным и больше вызовов с тем же самым словарем не производилось.
  • <Словарь упаковки> - (необязательный аргумент) (возможен аргумент-переменная (ByRef)) При упаковке большого блока частями необходимо передать в этот аргумент переменную, которая в начале упаковки будет равна нулю или пустому значению. Эта переменная будет хранить промежуточное состояние упаковки (чаще всего буфер). После выполнения последней операции упаковки (Завершающий блок равен 1), внутренние ресурсы, требуемые на упаковку, освобождаются, и переменная будет хранить неопределенное значение (чаще всего буфер с бесполезной информацией) до того, как она будет удалена из системы.

Возвращаемое значение

В зависимости от аргумента <Данные для упаковки>, функция возвращает:

  • <Данные для упаковки> являются строкой или текстом: результат упаковки переменного блока данных в виде строки ANSI.
  • <Данные для упаковки> являются буфером: результат упаковки переменного блока данных в виде буфера.

Примеры

//Загрузим файл в строку
сФайл:=FileToString("C:\ТестовыйФайл.txt");

//Упакуем строку сФайл с помощью алгоритма GZip частями по 1024 байта
РазмерБлока:=1024;
Словарь:=0;
сРезультат:="";
j:=0;
For i:=1 To Length(сФайл) div РазмерБлока Do
  j:=j+РазмерБлока;
  сРезультат:=сРезультат+StreamCompress(Mid(сФайл,(i-1)*РазмерБлока+1,РазмерБлока),"GZ",6,0,Словарь);
EndDo;
//Упакуем последний блок меньше 1024 байт (возможен пустой блок)
сРезультат:=сРезультат+StreamCompress(Right(сФайл,Length(сФайл)-j),"GZ",6,1,Словарь);

//Сохраним упакованный блок в виде файла
StringToFile(сРезультат,"C:\ТестовыйФайл.gz");

//Распакуем блок сРезультат с помощью алгоритма GZip частями по 1024 байта
//Для GZip необходимо также указать общий размер упакованного блока в переменной Словарь при первом вызове
РазмерБлока:=1024;
Словарь:=Length(сРезультат);
сФайл2:="";
j:=0;
For i:=1 To Length(сРезультат) div РазмерБлока Do
  j:=j+РазмерБлока;
  сФайл2:=сФайл2+StreamDecompress(Mid(сРезультат,(i-1)*РазмерБлока+1,РазмерБлока),"GZ",0,Словарь);
EndDo;
//Распакуем последний блок меньше 1024 байт (возможен пустой блок)
сФайл2:=сФайл2+StreamDecompress(Right(сРезультат,Length(сРезультат)-j),"GZ",1,Словарь);

//Сравним сФайл и сФайл2
If сФайл<>сФайл2 Then
  Message("Результаты не совпадают!","!");
Else
  Message("Результаты совпадают!","I");
EndIf;