如何在python中从网络套接字解压LZW数据包?

如何在python中从网络套接字解压LZW数据包?,python,networking,compression,Python,Networking,Compression,如何给LZW包充气?有图书馆吗 我一直在尝试用python对国家气象局的EMWIN流进行膨胀和解码 它要求从PKUNZIP格式解压数据包 我研究发现PKZIP很接近或是LZW。但是我找不到任何图书馆可以用这个 ZLIB是gzip,它是LZ77和哈夫曼编码 LZW图书馆没有我能找到的文档 我发现的这个片段要求数据是某种类型的列表 这就是我到目前为止一直在做的事情。小心修补 import socket sck = socket.socket(socket.AF_INET, socket.

如何给LZW包充气?有图书馆吗

我一直在尝试用python对国家气象局的EMWIN流进行膨胀和解码

它要求从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
整个协议的文档如下所示


^^^这几乎是我能找到的所有内容,zipfile模块处理PKZIP数据()

,所以我的问题不是它被压缩了,而是它被编码了

它是异或的,然后一些数据包被压缩,而不是所有的数据包。 xor的键是0xFF,然后可以使用zlib解压缩文件

故事的寓意: 如果由于某种原因,有人遇到压缩数据包而无法解压缩,请尝试查看它们是否已编码


谢谢Jose Nieves

我相信你也知道我不知道在哪里可以处理套接字数据,我假设它是一个字符串。只是文件是的,但我更感兴趣的是处理EMWIN以获得诸如hwo和天气警报之类的文本产品“其他国家数据产品,如给定小时内的所有地面观测(MetaR),首先打包到一个“文件”中,然后进行压缩和传输。”,您应该能够修剪零字节,然后将1024字节块作为文件处理。