Как мне распаковать LZW-пакеты из сетевого сокета в python? - PullRequest
2 голосов
/ 15 апреля 2019

Как мне накачать пакеты LZW?Есть ли библиотека?

Я пытался раздувать и декодировать поток EMWIN Национальной метеорологической службы в python.

Требуется, чтобы пакеты были разархивированы из формата PKUNZIP, поэтому в нем говорится.

Я исследовал и обнаружил, что PKZIP близок или является LZW.Но я не могу найти какую-либо библиотеку, чтобы использовать это.

ZLIB - это gzip, который является LZ77, и в библиотеке LZW для кодирования Хаффмана нет документации, которую я могу найти, и для этого найденного фрагмента требуется, чтобы данные представляли собой какой-то список

Это то, с чем я работал до сих пор.не возражайте против возни

    import socket


sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect(("1.pool.iemwin.net", 2211))
sck.send("")

data = sck.recv(1116)
sck.close()



def decompress(compressed):
    """Decompress a list of output ks to a string."""
    from cStringIO import StringIO

    # Build the dictionary.
    dict_size = 256
    dictionary = dict((i, chr(i)) for i in xrange(dict_size))
    # in Python 3: dictionary = {i: chr(i) for i in range(dict_size)}

    # use StringIO, otherwise this becomes O(N^2)
    # due to string concatenation in a loop
    result = StringIO()
    w = chr(compressed.pop(0))
    result.write(w)
    for k in compressed:
        if k in dictionary:
            entry = dictionary[k]
        elif k == dict_size:
            entry = w + w[0]
        else:
            raise ValueError('Bad compressed k: %s' % k)
        result.write(entry)

        # Add w+entry[0] to the dictionary.
        dictionary[dict_size] = w + entry[0]
        dict_size += 1

        w = entry
    return result.getvalue()


new = decompress(data)
print new

Документация для всего протокола такова: https://www.nws.noaa.gov/emwin/winpro.htm

^^^ Это почти все, что я мог найти

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Так что моя проблема была не в том, что он был сжат, он был фактически закодирован.

Это XORed, и затем некоторые пакеты сжимаются не все из них. Ключ к xor - 0xFF, а затем вы можете использовать zlib для распаковки файлов

Мораль истории: Если по какой-то причине кто-то сталкивается со сжатыми пакетами и не может их распаковать, попробуйте проверить, не закодированы ли они.

Спасибо, Хосе Ньевес

0 голосов
/ 15 апреля 2019

Модуль zipfile обрабатывает данные PKZIP (https://docs.python.org/3/library/zipfile.html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...