Вопрос по compression, c#, python – Python: Inflate и Deflate реализации

48

Error: User Rate Limit ExceededDeflateError: User Rate Limit ExceededInflate.

Error: User Rate Limit ExceededInflateError: User Rate Limit ExceededDeflateError: User Rate Limit ExceededCompressError: User Rate Limit ExceededDecompressError: User Rate Limit Exceeded

result_data = zlib.decompress( base64_decoded_compressed_string )

Error: User Rate Limit Exceeded

Error -3 while decompressing data: incorrect header check

Error: User Rate Limit Exceeded

result_data = gzip.GzipFile( fileobj = StringIO.StringIO( base64_decoded_compressed_string ) ).read()

Error: User Rate Limit Exceeded

IOError: Not a gzipped file

Error: User Rate Limit ExceededDeflatedError: User Rate Limit ExceededGzippedError: User Rate Limit Exceeded

Error: User Rate Limit ExceededDeflateError: User Rate Limit ExceededInflateError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

  1. Find an existing implementation (ideal) of Inflate and Deflate in Python
  2. Write my own Python extension to the zlib c library that includes Inflate and Deflate
  3. Call something else that can be executed from the command line (such as a Ruby script, since Inflate/Deflate calls in zlib are fully wrapped in Ruby)
  4. ?

Error: User Rate Limit Exceeded

Additional information: The result of deflating (and encoding) a string should, for the purposes I need, give the same result as the following snippet of C# code, where the input parameter is an array of UTF bytes corresponding to the data to compress:

public static string DeflateAndEncodeBase64(byte[] data)
{
    if (null == data || data.Length < 1) return null;
    string compressedBase64 = "";

    //write into a new memory stream wrapped by a deflate stream
    using (MemoryStream ms = new MemoryStream())
    {
        using (DeflateStream deflateStream = new DeflateStream(ms, CompressionMode.Compress, true))
        {
            //write byte buffer into memorystream
            deflateStream.Write(data, 0, data.Length);
            deflateStream.Close();

            //rewind memory stream and write to base 64 string
            byte[] compressedBytes = new byte[ms.Length];
            ms.Seek(0, SeekOrigin.Begin);
            ms.Read(compressedBytes, 0, (int)ms.Length);
            compressedBase64 = Convert.ToBase64String(compressedBytes);
        }
    }
    return compressedBase64;
}

Error: User Rate Limit Exceeded

7b0HYBxJliUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28995777333nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8iZvl5mbV5mi1nab6cVrM8XeT/Dw==

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

More Information:

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

SOLVED

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

import zlib
import base64

def decode_base64_and_inflate( b64string ):
    decoded_data = base64.b64decode( b64string )
    return zlib.decompress( decoded_data , -15)

def deflate_and_base64_encode( string_val ):
    zlibbed_str = zlib.compress( string_val )
    compressed_string = zlibbed_str[2:-4]
    return base64.b64encode( compressed_string )

Ваш Ответ

2   ответа
21

Вы все еще можете использоватьzlib модуль для раздувания / выкачивания данных.gzip модуль использует его внутри, но добавляет заголовок файла, чтобы превратить его в gzip-файл. Глядя наgzip.py файл, что-то вроде этого может работать:

import zlib

def deflate(data, compresslevel=9):
    compress = zlib.compressobj(
            compresslevel,        # level: 0-9
            zlib.DEFLATED,        # method: must be DEFLATED
            -zlib.MAX_WBITS,      # window size in bits:
                                  #   -15..-8: negate, suppress header
                                  #   8..15: normal
                                  #   16..30: subtract 16, gzip header
            zlib.DEF_MEM_LEVEL,   # mem level: 1..8/9
            0                     # strategy:
                                  #   0 = Z_DEFAULT_STRATEGY
                                  #   1 = Z_FILTERED
                                  #   2 = Z_HUFFMAN_ONLY
                                  #   3 = Z_RLE
                                  #   4 = Z_FIXED
    )
    deflated = compress.compress(data)
    deflated += compress.flush()
    return deflated

def inflate(data):
    decompress = zlib.decompressobj(
            -zlib.MAX_WBITS  # see above
    )
    inflated = decompress.decompress(data)
    inflated += decompress.flush()
    return inflated

Я не знаю, соответствует ли это в точности тому, что требуется вашему серверу, но эти две функции способны обмениваться любыми данными, которые я пробовал.

Параметры отображаются непосредственно на то, что передается функциям библиотеки zlib.

Python & # X21D2;C
zlib.compressobj(...) & # X21D2;deflateInit(...)
compressobj.compress(...) & # X21D2;deflate(...)
zlib.decompressobj(...) & # X21D2;inflateInit(...)
decompressobj.decompress(...) & # X21D2;inflate(...)

Конструкторы создают структуру, заполняют ее значениями по умолчанию и передают ее функциям init. compress/decompress методы обновляют структуру и передают ееinflate/deflate.

Error: User Rate Limit Exceeded Demi
Error: User Rate Limit Exceeded
Как 21-символьная строка ввода приводит к 212-байтовому дефлированному выводу? Включает ли это заголовок файла deflate?
@ Адам: 212 байт? Его строка в кодировке base64 имеет длину 160 байт, которая DE-кодирует до 118 байт. Возможно, вы его закодировали (160 * 4/3 приблизительно == 212). Скачать заголовок файла? Возможно, вы имели в виду заголовок файла gzip - он не похож на один из них (gzip.org/zlib/rfc-gzip.htmlError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Demi
20

Это дополнение к ответу MizardX, содержащее некоторые пояснения и справочную информацию.

Увидетьhttp://www.chiramattel.com/george/blog/2007/09/09/deflatestream-block-length-does-not-match.html

В соответствии сRFC 1950Поток zlib, построенный по умолчанию, состоит из:

  • a 2-byte header (e.g. 0x78 0x9C)
  • a deflate stream -- see RFC 1951
  • an Adler-32 checksum of the uncompressed data (4 bytes)

C #DeflateStream работает на (как вы уже догадались) потоке-дефляте. Код MizardX сообщает модулю zlib, что данные являются необработанным потоком сдувания.

Наблюдения: (1) Надеемся, что C # «дефляция» метод получения более длинной строки происходит только с коротким вводом (2) Использование необработанного потока deflate без контрольной суммы Adler-32? Немного рискованно, если не заменить чем-то лучшим.

Updates

error message Block length does not match with its complement

Если вы пытаетесь надуть некоторые сжатые данные с помощью C #DeflateStream и вы получите это сообщение, тогда вполне возможно, что вы даете ему поток zlib, а не поток deflate.

УвидетьКак вы используете DeflateStream на части файла?

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

The Java Deflater ... используется & quot; веб-сайтом & quot; ... C # DeflateStream & quot; довольно прост и был протестирован с реализацией Java & quot ;. Какой из следующих возможных конструкторов Java Deflater использует веб-сайт?

public Deflater(int level, boolean nowrap)

Creates a new compressor using the specified compression level. If 'nowrap' is true then the ZLIB header and checksum fields will not be used in order to support the compression format used in both GZIP and PKZIP.

public Deflater(int level)

Creates a new compressor using the specified compression level. Compressed data will be generated in ZLIB format.

public Deflater()

Creates a new compressor with the default compression level. Compressed data will be generated in ZLIB format.

A one-line deflater после отбрасывания 2-байтового заголовка zlib и 4-байтовой контрольной суммы:

uncompressed_string.encode('zlib')[2:-4] # does not work in Python 3.x

или же

zlib.compress(uncompressed_string)[2:-4]
Error: User Rate Limit Exceeded Demi
Error: User Rate Limit Exceeded Demi
Error: User Rate Limit Exceeded Demi
Error: User Rate Limit Exceeded Demi

Похожие вопросы