WebSocket и GZIP - страница 3

 
Vasiliy Sokolov #:
Вам нужно знать формат gzip и распоковать его с помощью системной функции CryptEncode(CRYPT_ARCH_ZIP)

Большое спасибо за подсказку! Действительно выгрыз из gzip содержательную часть, и удалось скормить ее функции  CryptDecode(CRYPT_ARCH_ZIP).

 

Правда если длина упакованной части большая, то CryptDecode(CRYPT_ARCH_ZIP)  криво распаковывает. Например массив длиной 685 символов распаковывает нормально, а длиной 1136 - уже криво. Причем кривота в результате как правило начинается после 3277 символа. И при этом ошибку функция не возвращает.

Ключ шифрования задаю key[] = {1, 0, 0, 0}

 
Ivan Titov #:

Правда если длина упакованной части большая, то CryptDecode(CRYPT_ARCH_ZIP)  криво распаковывает. Например массив длиной 685 символов распаковывает нормально, а длиной 1136 - уже криво. Причем кривота в результате как правило начинается после 3277 символа. И при этом ошибку функция не возвращает.

Ключ шифрования задаю key[] = {1, 0, 0, 0}

Приложите тестовый скрипт, чтобы MQ могли воспроизвести.

 
Stanislav Korotky #:
Приложите тестовый скрипт, чтобы MQ могли воспроизвести.

Прилагаю. В результирующей строке с 3331 символа начинается нарушение формата jason. Те же самые входные данные в питоне распаковываются без ошибок:

    def on_message(self, ws, message):
        compressed_data = gzip.GzipFile(fileobj=io.BytesIO(message), mode='rb')
        decompressed_data = compressed_data.read()
        utf8_data = decompressed_data.decode('utf-8')
        print(utf8_data)  #this is the message you need 
Файлы:
ZIP.mq5  33 kb
 
Ivan Titov #:

Прилагаю. В результирующей строке с 3331 символа начинается нарушение формата jason. Те же самые входные данные в питоне распаковываются без ошибок:

Ищите ошибку на сервере или в питонской части. Конкретно приложенный бинарный массив zip[1123] разжимается методом "deflate-raw" один в один как в MQL5. Я проверял на онлайн сайтах и в браузере через JavaScript.

Может быть проблема в том, что в сетевых пакетах друг за другом идут склеенные потоки сжатых данных, что не каждый софт правильно понимает. Конкретно в JavaScript это помечается ошибкой "Junk found after end of compressed data."

 
Stanislav Korotky #:

 Конкретно приложенный бинарный массив zip[1123] разжимается методом "deflate-raw" один в один как в MQL5.  Я проверял на онлайн сайтах

Можете скинуть ссылку, на каких сайтах проверяли?
 
Ivan Titov #:

Правда если длина упакованной части большая, то CryptDecode(CRYPT_ARCH_ZIP)  криво распаковывает. Например массив длиной 685 символов распаковывает нормально, а длиной 1136 - уже криво. Причем кривота в результате как правило начинается после 3277 символа. И при этом ошибку функция не возвращает.

Ключ шифрования задаю key[] = {1, 0, 0, 0}

Проблема не в длине и функции CryptDecode. Я ею разжимал файлы > 500 мбайт. На сколько знаю, gzip разбивает файл на чанки и жмет их отдельными архивчиками. Возможно Вы перелители границу чанка, или не учитываете это при доступе к архиву. Возможно причина именно в этом.

 
Ivan Titov #:
Можете скинуть ссылку, на каких сайтах проверяли?

Например, здесь. Но потребуется бинарный массив сконвертировать в base64, например:

CryptEncode(CRYPT_BASE64, zip, key, result);
 
Да, действительно. Видимо сообщение ломает функция SocketTlsReadAvailable()
 
Vasiliy Sokolov #:
На сколько знаю, gzip разбивает файл на чанки и жмет их отдельными архивчиками.  Возможно Вы перелители границу чанка, или не учитываете это при доступе к архиву

Границу определяю исходя из описания формата по последовательности 3-х символов:  0x1f 0x8b 0x08. Далее убираю 10 символов, включая эти(заголовок), и 8 символов перед следующей границей(подвал). Дополнительных заголовков нет.