Python: Расширьте и Выкачайте реализации

Указатель на элемент массива является действительно итератором в массив.

, Как Вы говорите в Java, итератор имеет больше знания базового контейнера, чем в C++. Итераторы C++ являются общими, и , пара из итераторов может обозначить любой диапазон: это может быть поддиапазоном контейнера, диапазоном по нескольким контейнерам (см. http://www.justsoftwaresolutions.co.uk/articles/pair_iterators.pdf или http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/zip_iterator.html ), или даже диапазон чисел (см. http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/counting_iterator.html )

категории итератора определяют то, что Вы можете и не можете сделать с данным итератором.

52
задан msanford 1 September 2017 в 03:44
поделиться

2 ответа

Это дополнение к ответу MizardX, дающее некоторые объяснения и предысторию.

См. http://www.chiramattel.com/george/blog/2007/09 /09/deflatestream-block-length-does-not-match.html

Согласно RFC 1950 поток zlib, созданный по умолчанию, состоит из:

  • 2-байтового заголовка (например, 0x78 0x9C)
  • поток deflate - см. RFC 1951
  • контрольную сумму Adler-32 несжатых данных (4 байта)

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

Наблюдения: (1) Можно надеяться, что метод "дефляции" C #, производящий более длинную строку, происходит только с коротким вводом (2) Использование необработанного потока дефлятирования без контрольная сумма Адлер-32? Немного рискованно,

Обновляет

сообщение об ошибке Длина блока не совпадает с его дополнением

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

См. Как вы используете DeflateStream для части файла?

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

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

public Deflater (int level, boolean nowrap)

Создает новый компрессор, используя указанный уровень сжатия. Если 'nowrap' истинно, то поля заголовка ZLIB и контрольной суммы не будут использоваться для поддержки формата сжатия, используемого как в GZIP, так и в PKZIP.

public Deflater (int level)

Создает новый компрессор, используя указанный уровень сжатия. Сжатые данные будут сгенерированы в формате ZLIB.

public Deflater ()

Создает новый компрессор с уровнем сжатия по умолчанию. Сжатые данные будут созданы в формате ZLIB.

Однострочный дефлятер после отбрасывания 2-байтового заголовка zlib и 4-байтовой контрольной суммы: nowrap 'истинно, тогда поля заголовка ZLIB и контрольной суммы не будут использоваться для поддержки формата сжатия, используемого как в GZIP, так и в PKZIP.

public Deflater (int level)

Создает новый компрессор, используя указанный уровень сжатия . Сжатые данные будут сгенерированы в формате ZLIB.

public Deflater ()

Создает новый компрессор с уровнем сжатия по умолчанию. Сжатые данные будут созданы в формате ZLIB.

Однострочный дефлятер после отбрасывания 2-байтового заголовка zlib и 4-байтовой контрольной суммы: nowrap 'истинно, тогда поля заголовка ZLIB и контрольной суммы не будут использоваться для поддержки формата сжатия, используемого как в GZIP, так и в PKZIP.

public Deflater (int level)

Создает новый компрессор, используя указанный уровень сжатия . Сжатые данные будут сгенерированы в формате ZLIB.

public Deflater ()

Создает новый компрессор с уровнем сжатия по умолчанию. Сжатые данные будут созданы в формате ZLIB.

Однострочный дефлятер после отбрасывания 2-байтового заголовка zlib и 4-байтовой контрольной суммы:

public Deflater ()

Создает новый компрессор с уровнем сжатия по умолчанию. Сжатые данные будут созданы в формате ZLIB.

Однострочный дефлятер после отбрасывания 2-байтового заголовка zlib и 4-байтовой контрольной суммы:

public Deflater ()

Создает новый компрессор с уровнем сжатия по умолчанию. Сжатые данные будут созданы в формате ZLIB.

Однострочный дефлятер после отбрасывания 2-байтового заголовка zlib и 4-байтовой контрольной суммы:

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

или

zlib.compress(uncompressed_string)[2:-4]
21
ответ дан 7 November 2019 в 09:36
поделиться

Вы все еще можете использовать модуль 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 C
zlib.compressobj (...) deflateInit (...)
compressobj.compress (... Методы compress / распаковать обновляют структуру и передают ее в inflate / deflate .

22
ответ дан 7 November 2019 в 09:36
поделиться
Другие вопросы по тегам:

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