18

ASCIIベースの文字列を圧縮する方法を探しています。何か助けはありますか?

また、解凍する必要があります。zlibを試しましたが、助けにはなりませんでした。

文字列をより短い長さに圧縮するにはどうすればよいですか?

コード:

def compress(request):
    if request.POST:
        data = request.POST.get('input')
        if is_ascii(data):
            result = zlib.compress(data)
            return render_to_response('index.html', {'result': result, 'input':data}, context_instance = RequestContext(request))
        else:
            result = "Error, the string is not ascii-based"
            return render_to_response('index.html', {'result':result}, context_instance = RequestContext(request))
    else:
        return render_to_response('index.html', {}, context_instance = RequestContext(request))
4

2 に答える 2

29

圧縮を使用しても、文字列の長さが常に短くなるとは限りません。

次のコードを検討してください。

import zlib
import bz2

def comptest(s):
    print 'original length:', len(s)
    print 'zlib compressed length:', len(zlib.compress(s))
    print 'bz2 compressed length:', len(bz2.compress(s))

空の文字列でこれを試してみましょう。

In [15]: comptest('')
original length: 0
zlib compressed length: 8
bz2 compressed length: 14

したがってzlib、余分な8文字とbz214文字が生成されます。圧縮メソッドは通常、解凍プログラムで使用するために、圧縮データの前に「ヘッダー」を配置します。このヘッダーは、出力の長さを増やします。

一言テストしてみましょう。

In [16]: comptest('test')
original length: 4
zlib compressed length: 12
bz2 compressed length: 40

ヘッダーの長さを差し引いても、圧縮によって単語が短くなることはありません。これは、この場合、圧縮するものがほとんどないためです。文字列内のほとんどの文字は1回だけ出現します。さて、短い文章です。

In [17]: comptest('This is a compression test of a short sentence.')
original length: 47
zlib compressed length: 52
bz2 compressed length: 73

この場合も、圧縮出力は入力テキストよりも大きくなります。テキストの長さが限られているため、繰り返しがほとんどないため、うまく圧縮されません。

圧縮が実際に機能するには、かなり長いテキストブロックが必要です。

In [22]: rings = '''
   ....:     Three Rings for the Elven-kings under the sky, 
   ....:     Seven for the Dwarf-lords in their halls of stone, 
   ....:     Nine for Mortal Men doomed to die, 
   ....:     One for the Dark Lord on his dark throne 
   ....:     In the Land of Mordor where the Shadows lie. 
   ....:     One Ring to rule them all, One Ring to find them, 
   ....:     One Ring to bring them all and in the darkness bind them 
   ....:     In the Land of Mordor where the Shadows lie.'''

In [23]: comptest(rings)                       
original length: 410
zlib compressed length: 205
bz2 compressed length: 248
于 2012-10-13T11:39:09.097 に答える
6

asciiであるためにデータを必要とせず、zlibに何でもフィードできます

>>> import zlib
>>> a='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' # + any binary data you want
>>> print zlib.compress(a)
x�KL$
�
>>>

ここでおそらく必要なもの-圧縮データをASCII文字列にしますか?私はここにいますか?
もしそうなら-圧縮データをコード化するためのアルファベットが非常に小さいことを知っておく必要があります=>したがって、より多くの記号を使用することになります。

たとえば、base64でバイナリデータをコーディングする場合(ASCII文字列を取得します)、そのために最大30%多くのスペースを使用します

于 2012-10-13T09:44:20.470 に答える