Skip to content

Commit

Permalink
feat: Добавлены методы упаковки / распаковки двоичных данных.
Browse files Browse the repository at this point in the history
  • Loading branch information
arkuznetsov committed May 18, 2022
1 parent 5254a5a commit 8eb0154
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 15 deletions.
41 changes: 32 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,16 @@

## Примеры использования

### Сжатие потока
### Упаковка потока

```bsl
#Использовать deflator
ВходящийПоток = Новый ФайловыйПоток("d:\tmp\inputFile.txt");
СжатыйПоток = Новый ПотокВПамяти();
УпакованныйПоток = Новый ПотокВПамяти();
Упаковщик = Новый УпаковщикDeflate();
Упаковщик.УпаковатьПоток(ВходящийПоток, СжатыйПоток, 1);
Упаковщик.УпаковатьПоток(ВходящийПоток, УпакованныйПоток, 1);
```

Expand All @@ -32,21 +32,45 @@
```bsl
#Использовать deflator
СжатыйПоток = Новый ПотокВПамяти();
УпакованныйПоток = Новый ПотокВПамяти();
ИсходящийПоток = Новый ФайловыйПоток("d:\tmp\outputFile.txt");
Упаковщик = Новый УпаковщикDeflate();
Упаковщик.РаспаковатьПоток(СжатыйПоток, ИсходящийПоток);
Упаковщик.РаспаковатьПоток(УпакованныйПоток, ИсходящийПоток);
```

### Сжатие файла
### Упаковка двоичных данных

```bsl
#Использовать deflator
ВходящиеДанные = Новый ДвоичныеДанные("d:\tmp\inputFile.txt");
Упаковщик = Новый УпаковщикDeflate();
УпакованныеДанные = Упаковщик.УпаковатьДанные(ВходящиеДанные, 1);
```

### Распаковка двоичных данных

```bsl
#Использовать deflator
УпакованныеДанные = Новый ДвоичныеДанные("d:\tmp\compressedFile.dfl");
Упаковщик = Новый УпаковщикDeflate();
ИсходящиеДанные = Упаковщик.РаспаковатьДанные(УпакованныеДанные);
```

### Упаковка файла

```bsl
#Использовать deflator
Упаковщик = Новый УпаковщикDeflate();
Упаковщик.УпаковатьФайл("d:\tmp\inputFile.txt", "d:\tmp\outputFile.dfl");
Упаковщик.УпаковатьФайл("d:\tmp\inputFile.txt", "d:\tmp\compressedFile.dfl");
```

Expand All @@ -56,7 +80,6 @@
#Использовать deflator
Упаковщик = Новый УпаковщикDeflate();
Упаковщик.РаспаковатьФайл("d:\tmp\inputFile.dfl", "d:\tmp\outputFile.txt");
Упаковщик.РаспаковатьФайл("d:\tmp\compressedFile.dfl", "d:\tmp\outputFile.txt");
```

46 changes: 44 additions & 2 deletions src/NUnitTests/Tests/external.os
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
ВсеТесты.Добавить("ТестДолжен_СоздатьКомпоненту");
ВсеТесты.Добавить("ТестДолжен_УпаковатьПоток");
ВсеТесты.Добавить("ТестДолжен_РаспаковатьПоток");
ВсеТесты.Добавить("ТестДолжен_УпаковатьДанные");
ВсеТесты.Добавить("ТестДолжен_РаспаковатьДанные");
ВсеТесты.Добавить("ТестДолжен_УпаковатьФайл");
ВсеТесты.Добавить("ТестДолжен_РаспаковатьФайл");

Expand Down Expand Up @@ -59,7 +61,7 @@

ВходящийПоток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ВходящийПоток, КодировкаТекста.UTF8);
ЗаписьДанных.ЗаписатьСимволы("Это текст для тестирования сжатия потока!");
ЗаписьДанных.ЗаписатьСимволы("Это текст для тестирования упаковки потока!");
ЗаписьДанных.Закрыть();
ВходящийПоток.Перейти(0, ПозицияВПотоке.Начало);

Expand All @@ -74,7 +76,7 @@
ДД = ИсходящийПоток.ЗакрытьИПолучитьДвоичныеДанные();
Сообщить(СтрШаблон("Сжатые данные: %1", Base64Строка(ДД)));

ТестоваяСтрока = "HYzRCYAwEENXOTe1XaCTCIeoSMVzhZeNvPYnJO9B2FQJyzjpKqrGwaM2ydjcWgl2nDd7isKFT9GMjxgHdHz5AQ==";
ТестоваяСтрока = "HYzRCYAwEENXOTfVOoCTCEUUyknPFd5tZNqfkPcC4cxCmOLBc8ti3Lx5TDOYlivBRaWra9j5BD6l00wY40RQlx8=";

юТест.ПроверитьРавенство(Base64Строка(ДД), ТестоваяСтрока, "Ошибка при упаковке потока");

Expand Down Expand Up @@ -112,6 +114,46 @@

КонецПроцедуры // ТестДолжен_РаспаковатьПоток()

Процедура ТестДолжен_УпаковатьДанные() Экспорт

Упаковщик = Новый УпаковщикDeflate();
юТест.ПроверитьРавенство(ТипЗнч(Упаковщик), Тип("УпаковщикDeflate"), "Не удалось создать компоненту УпаковщикDeflate");

ВходящийПоток = Новый ПотокВПамяти();
ЗаписьДанных = Новый ЗаписьДанных(ВходящийПоток, КодировкаТекста.UTF8);
ЗаписьДанных.ЗаписатьСимволы("Это текст для тестирования упаковки двоичных данных!");

ВходящиеДанные = ВходящийПоток.ЗакрытьИПолучитьДвоичныеДанные();

ИсходящиеДанные = Упаковщик.УпаковатьДанные(ВходящиеДанные, 2);

ТестоваяСтрока = "HYvBCYAwEARbiZ1qRPLwYSWCBIUQSWxhtiPv8jl2Zvc4FenBzkPVohi4eXUM40zRTCdz0SxbsfIZ1CErxR+yQVGiadfmwscDph8=";

юТест.ПроверитьРавенство(Base64Строка(ИсходящиеДанные), ТестоваяСтрока, "Ошибка при упаковке двоичных данных");

КонецПроцедуры // ТестДолжен_УпаковатьДанные()

Процедура ТестДолжен_РаспаковатьДанные() Экспорт

Упаковщик = Новый УпаковщикDeflate();
юТест.ПроверитьРавенство(ТипЗнч(Упаковщик), Тип("УпаковщикDeflate"), "Не удалось создать компоненту УпаковщикDeflate");

СжатыеДанные = "HYvBCYAwEARb0U6TgPjwYSVCCAohktjCbEfe5bPszLJcSozF4qEpKi3cvDqncaYqMChkunUbAlmRz0SbQ6P6qRhU7XQd2lz4YcL6Aw==";
ВходящиеДанные = Base64Значение(СжатыеДанные);

ИсходящиеДанные = Упаковщик.РаспаковатьДанные(ВходящиеДанные);

ИсходящийПоток = ИсходящиеДанные.ОткрытьПотокДляЧтения();
ЧтениеДанных = Новый ЧтениеДанных(ИсходящийПоток, КодировкаТекста.UTF8);
ИсходящийПоток.Перейти(0, ПозицияВПотоке.Начало);
РаспакованыйТекст = ЧтениеДанных.ПрочитатьСимволы();

ТестоваяСтрока = "Это текст для тестирования распаковки двоичных данных!";

юТест.ПроверитьРавенство(РаспакованыйТекст, ТестоваяСтрока, "Ошибка при распаковке двоичных данных");

КонецПроцедуры // ТестДолжен_РаспаковатьДанные()

Процедура ТестДолжен_УпаковатьФайл() Экспорт

Упаковщик = Новый УпаковщикDeflate();
Expand Down
69 changes: 65 additions & 4 deletions src/oscript-component/DeflatePacker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,68 @@ public class DeflatePacker : AutoContext<DeflatePacker>
{

/// <summary>
/// Выполняет упаковку входящего потока
/// Выполняет упаковку двоичных данных по алгоритму Deflate
/// </summary>
/// <param name="InputData">ДвоичныеДанные. Данные для упаковки.</param>
/// <param name="OutputCompressionLevel">Число. Уровень сжатия (0-2).</param>
/// <returns>ДвоичныеДанные - Результат упаковки</returns>
[ContextMethod("УпаковатьДанные")]
public IValue CompressData(IValue InputData, int OutputCompressionLevel = 2)
{

MemoryStreamContext inputStream;

if (InputData.AsObject() is BinaryDataContext data)
{
inputStream = MemoryStreamContext.Constructor();
data.OpenStreamForRead().CopyTo(inputStream);
inputStream.Seek(0, StreamPositionEnum.Begin);
}
else
{
throw RuntimeException.InvalidArgumentType("InputData");
}

MemoryStreamContext outputStream = MemoryStreamContext.Constructor();

CompressStream(inputStream, outputStream);

return outputStream.CloseAndGetBinaryData();

}

/// <summary>
/// Выполняет распаковку данных по алгоритму Deflate
/// </summary>
/// <param name="InputData">Поток. Исходный поток для распаковки.</param>
/// <returns>ДвоичныеДанные - Результат распаковки</returns>
[ContextMethod("РаспаковатьДанные")]
public IValue DecompressData(IValue InputData)
{

MemoryStreamContext inputStream;

if (InputData.AsObject() is BinaryDataContext data)
{
inputStream = MemoryStreamContext.Constructor();
data.OpenStreamForRead().CopyTo(inputStream);
inputStream.Seek(0, StreamPositionEnum.Begin);
}
else
{
throw RuntimeException.InvalidArgumentType("InputData");
}

MemoryStreamContext outputStream = MemoryStreamContext.Constructor();

DecompressStream(inputStream, outputStream);

return outputStream.CloseAndGetBinaryData();

}

/// <summary>
/// Выполняет упаковку входящего потока по алгоритму Deflate
/// </summary>
/// <param name="InputStream">Поток. Исходный поток для упаковки.</param>
/// <param name="OutputStream">Поток. Результат упаковки.</param>
Expand Down Expand Up @@ -73,7 +134,7 @@ public void CompressStream(IValue InputStream, IValue OutputStream, int OutputCo
}

/// <summary>
/// Выполняет распаковку входящего потока
/// Выполняет распаковку входящего потока по алгоритму Deflate
/// </summary>
/// <param name="InputStream">Поток. Исходный поток для распаковки.</param>
/// <param name="OutputStream">Поток. Результат распаковки.</param>
Expand Down Expand Up @@ -105,7 +166,7 @@ public void DecompressStream(IValue InputStream, IValue OutputStream)
}

/// <summary>
/// Выполняет упаковку указанного файла
/// Выполняет упаковку указанного файла по алгоритму Deflate
/// </summary>
/// <param name="InputFileName">Строка. Путь к файлу для упаковки.</param>
/// <param name="OutputFileName">Строка. Путь к файлу - результату упаковки.</param>
Expand Down Expand Up @@ -142,7 +203,7 @@ public void CompressFile(IValue InputFileName, IValue OutputFileName, int Output
}

/// <summary>
/// Выполняет распаковку указанного файла
/// Выполняет распаковку указанного файла по алгоритму Deflate
/// </summary>
/// <param name="InputFileName">Строка. Путь к файлу для распаковки.</param>
/// <param name="OutputFileName">Строка. Путь к файлу - результату распаковки.</param>
Expand Down

0 comments on commit 8eb0154

Please sign in to comment.