2012-04-26 10 views
7

クイック質問。私は、大文字と小文字を使用して文字列を短縮するために、Pythonでエンコーダを見つけたり、書き込んだりしようとしています。数字の文字列は次のようになります。数値の文字列を短縮した英数字の文字列にエンコードして戻します。

20120425161608678259146181504021022591461815040210220120425161608667 

長さは常に同じです。

私の最初に考えたのはもっとこのようなものの中に、この文字列を短縮するために、大文字と小文字の文字と数字を利用するいくつかの簡単なエンコーダを書くことだった:完全に任意だった

a26Dkd38JK 

だけにしよう可能な限り明確にする。 これを行うには本当に滑らかな方法があると確信しています。おそらくすでに組み込まれているでしょう。これは尋ねることさえ恥ずかしい質問かもしれません。

また、短縮された文字列を受け取り、長い数値に変換する必要があります。 何かを書いてコードを投稿すべきですか、これは私がすでに知っておくべきPythonの関数で構築された1行ですか?

ありがとうございます!

+4

[base64](http://docs.python.org/library/base64.html) – JBernardo

+0

JBernardo-it it。回答を投稿する:) –

+0

自分でコードを書いてここに投稿するのは良いことです。 – Julian

答えて

10

これはかなり良い圧縮である:

import base64 

def num_to_alpha(num): 
    num = hex(num)[2:].rstrip("L") 

    if len(num) % 2: 
     num = "0" + num 

    return base64.b64encode(num.decode('hex')) 

それは最初のバイト文字列に整数をオンして、BASE64は、それをコードしています。ここでは、デコーダの:

def alpha_to_num(alpha): 
    num_bytes = base64.b64decode(alpha) 
    return int(num_bytes.encode('hex'), 16) 

例:そうzlibのは、数字の文字列を圧縮する時、スマート本物

>>> num_to_alpha(20120425161608678259146181504021022591461815040210220120425161608667) 
'vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w==' 
>>> alpha_to_num('vw4LUVm4Ea3fMnoTkHzNOlP6Z7eUAkHNdZjN2w==') 
20120425161608678259146181504021022591461815040210220120425161608667 
+0

+1。これは文字列ではなくintをとることに注意してください。 –

+0

これはうまくいくようです。正確に私が探していたもの、ありがとう。 RE:intとstring:この関数に文字列を渡すと実際には機能しません。それはintである必要があります。よくできました! –

+0

これは任意精度の整数を必要とします。これは幸いにもpythonにあります。 – ninjagecko

0
>>> s="20120425161608678259146181504021022591461815040210220120425161608667" 
>>> import base64, zlib 
>>> base64.b64encode(zlib.compress(s)) 
'eJxly8ENACAMA7GVclGblv0X4434WrKFVW5CtJl1HyosrZKRf3hL5gLVZA2b' 
>>> zlib.decompress(base64.b64decode(_)) 
'20120425161608678259146181504021022591461815040210220120425161608667' 

をではありません:(

6

カスタム(ない2つの機能があります。 base64に基づいて)、より短い出力を生成する:

chrs = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 
l = len(chrs) 

def int_to_cust(i): 
    result = '' 
    while i: 
     result = chrs[i % l] + result 
     i = i // l 
    if not result: 
     result = chrs[0] 
    return result 

def cust_to_int(s): 
    result = 0 
    for char in s: 
     result = result * l + chrs.find(char) 
    return result 

と結果は以下のとおりです。

>>> int_to_cust(20120425161608678259146181504021022591461815040210220120425161608667) 
'9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx' 
>>> cust_to_int('9F9mFGkji7k6QFRACqLwuonnoj9SqPrs3G3fRx') 
20120425161608678259146181504021022591461815040210220120425161608667L 

あなたはchrs変数に他の文字を追加する場合にも、生成された文字列を短縮することができます。

+0

私はあなたがlibを使用する代わりに、自分自身でエンコードしているベース64をやっていると思います。 –

+1

@PaulHoang:あなたの推測は間違っていると思います。私は同様の方法で機能するが、1)パディング(ナイトクラッカーの答えから ''を取り除こうとする)、2)変換された値を表現するために使用する独自の文字を定義する能力。それが動作する方法は、base64と非常に似ていますが、base64ではありません。そのようなことを行うライブラリはおそらくありますが、それがどれであるかはわかりませんでした。 – Tadeck

+0

私はこのソリューションが本当に好きです。さまざまな提案されたソリューションで遊んで、私はこれを文字と数字だけに制限し、将来的にはさらに多くの文字を追加することをコントロールできるので、これが一番好きです。うまくいった。 –

関連する問題