Метод gzcompress из PHP в C#

189
28 декабря 2019, 17:20

Каким методом в C# можно заменить метод сжатия строки из PHP

gzcompress("string", число степени сжатия)
Answer 1

Полного аналога нет.

В качестве альтернативы можно использовать DelateStream или GZipStream. Но надо учитывать, что полученные массивы байт будут отличаться:

|gzcompress|DeflateStream|GZipStream|gzencode|
|PHP       |.net 4+      |.net 4+   |PHP     |
|----------|-------------|----------|--------|---
|          |             |31        |31      |
|          |             |139       |139     |
|          |             |8         |8       | h
|          |             |0         |0       | e
|          |             |0         |0       | a
|          |             |0         |0       | d
|          |             |0         |0       | e
|          |             |0         |0       | r
|120       |             |4         |2       |
|218       |             |0         |3       |
|----------|-------------|----------|--------|---
|43        |43           |43        |43      |
|73        |73           |73        |73      | c
|45        |45           |45        |45      | o
|46        |46           |46        |46      | m
|81        |81           |81        |81      | p
|200       |200          |200       |200     | r
|77        |77           |77        |77      | e
|45        |45           |45        |45      | s
|46        |46           |46        |46      | s
|78        |78           |78        |78      | e
|76        |76           |76        |76      | d
|79        |79           |79        |79      |
|85        |85           |85        |85      | c
|200       |200          |200       |200     | o
|204       |204          |204       |204     | n
|83        |83           |83        |83      | t
|40        |40           |40        |40      | e
|200       |200          |200       |200     | n
|40        |40           |40        |40      | t
|0         |0            |0         |0       |
|0         |0            |0         |0       |
|----------|-------------|----------|--------|---
|73        |             |17        |17      |
|21        |             |189       |189     | f
|7         |             |70        |70      | o
|37        |             |177       |177     | o
|          |             |19        |19      | t
|          |             |0         |0       | e
|          |             |0         |0       | r
|          |             |0         |0       |

Во всех четырех случаях использовалось максимально доступное в настройках сжатие текста "test message in php".

Как не сложно заметить, сжатый контент совпадает, а дополнительные header и footer отличаются.

Тут надо сделать серьезную оговорку, что совпадение контента обусловлено его длиной и содержимым и, в общем случае, на это рассчитывать не стоит (см. ниже), но полученный набор байт, в любом случае, может быть распакован при соответствующей корректировке заголовков.

Также при сравнении стоит учесть, что в версиях .net меньше 4 была использована собственная реализация алгоритмов Deflate, мягко говоря, неудачная. Начиная с 4.0 используется zlib.

Кроме того, оригинальная PHP-функция позволяет выбирать из десяти возможных степеней сжатия (0 - без сжатия, 9 - максимальное). DeflateStream и GZipStream позволяют выбирать только из трех вариантов: None, Fastest, Optimal, при этом не очевидно как между собой соотносятся оригинальные уровни zlib и предложенные уровни потоков (ну кроме None).

Ну и всегда остается возможность самостоятельно реализовать необходимые функции, импортировав их из zlib. Можно подсмотреть как это сделано в исходниках DeflateStream или GzipStream.

READ ALSO
Не выводится the_excerpt() поста в WordPress

Не выводится the_excerpt() поста в WordPress

Вот код вывода трех последних постовУ меня много рубрик, но этот код выводит последние три добавленные посты не зависимо в каких рубриках...

126
Создаю тест на php

Создаю тест на php

Нужно сделать так чтобы вопросы появлялись по очереди после того как пользователь ответит

148
Как можно убрать этот лимит

Как можно убрать этот лимит

Есть таблица и в нем запись длинной 1886209Когда достаю эту записть то получаю строку длиной 1048576

162