Windev Compress(): какой формат сжатия используется

кто-нибудь знает, какой метод сжатия использует WinDev-функция Compress() и, возможно, как распаковать результат в php?

API WinDev говорит только о «бинарном» сжатии, но никаких подробностей об этом нет. http://doc.windev.com/en-US/?3024012&product=WD&productversion=XXA150

В php я могу использовать unpack(), но должен сказать, какой формат. Без знаний это поиск иголки в стоге сена.

Может быть, есть кто-нибудь, кто уже сделал это, и может помочь мне.

Пример: zip -Файл, содержащий образец-Результат функции Compress() и простое содержимое для сравнения


person MIB    schedule 06.02.2014    source источник
comment
Вероятно, это zlib, который очень распространен. Если бы вы могли сжать образец и загрузить его для анализа, мы могли бы продолжить анализ.   -  person Multimedia Mike    schedule 08.02.2014
comment
Я добавил ссылку в свой пост выше на почтовый индекс, содержащий образец Compress()-Result.   -  person MIB    schedule 10.02.2014
comment
Хорошо, этот образец не похож на zlib или bzip2. Фактически, оба они сжимают образец лучше, чем эта библиотека сжатия. Я предполагаю, что у вас нет никакого контроля над тем, что генерирует сервер, что мотивирует этот запрос?   -  person Multimedia Mike    schedule 10.02.2014
comment
У нас есть приложения для мобильных устройств на основе Windev. Мы хотим сжать данные, чтобы уменьшить объемы передачи. Использование zlib кажется немного сложным из-за реализации dll-файлов. Если есть кто-то, кто знаком с этой функцией Compress(), это может быть проще/быстрее.   -  person MIB    schedule 12.02.2014


Ответы (2)


PCSOFT использует свой формат WDZ для большей части всего, и он не является стандартным, поэтому вы не сможете открыть его с помощью обычных инструментов. Я слышал, что они использовали некоторые из обычных библиотек, таких как zlib, но привнесли в них свой небольшой поворот, так что вы, вероятно, могли работать только с их инструментом WDZIP.EXE для работы с этим.

Вам следует обратить внимание на другие функции, такие как zipCreate(), для создания архивов и использования некоторых стандартных форматов: http://doc.windev.com/en-US/?3082007

Надеюсь это поможет :)

person Samuël Tremblay    schedule 30.12.2014
comment
Эй, спасибо за ответ. Тем временем мои коллеги уже нашли решение на основе gzip, которое решило нашу проблему. Мы больше не экспериментируем с функцией сжатия. Но, возможно, поможет ваш ответ кому-то еще. - person MIB; 24.04.2015

Этому вопросу 7 лет, но на случай, если кому-то понадобится прочитать данные, которые были сжаты с помощью этой функции, мне тоже пришлось отменить это:

  • It starts with 01 01 00 00 00 XX where XX is:
    • 00 for "no compression"
    • 04 для ЛЗВ
  • Then there's the length of compressed data in a little endian int32.
    • If there's compression, it's followed by the length of the uncompressed buffer (data length + 4).
  • Then there's the buffer (encoded or not) which contains:
    • The length of uncompressed data in a little endian int32.
    • Фактические данные.

Сжатие LZW использует 16-битные коды вместо обычных 12-битных, а его чистый код равен нулю, что означает, что каждый литеральный код увеличивается.

Я взял пакет Go compress/lzw и немного адаптировал его: 16-битные коды, нулевой чистый код, декрементирование каждого литерального кода. И он правильно декодирует все до сих пор.

person John N    schedule 23.04.2021