intをASCIIに変換してPythonに戻す


137

私は自分のサイトのURL短縮ツールの作成に取り組んでおり、現在の計画(私は提案を受け入れています)では、ノードIDを使用して短縮URLを生成します。したがって、理論的には、ノード26はshort.com/z、ノード1はshort.com/a、ノード52はshort.com/Z、ノード104はとなる可能性がありますshort.com/ZZ。ユーザーがそのURLにアクセスした場合、プロセスを逆にする必要があります(明らかに)。

私はこれについていくらか不器用な方法を考えることができますが、もっと良い方法があると思います。助言がありますか?


回答:


239

ASCIIから整数へ:

ord('a')

与える 97

そして文字列に戻ります:

  • Python2の場合: str(unichr(97))
  • Python3の場合: chr(97)

与える 'a'


82
そしてpython3ではchr()!
Ehsan M. Kermani 2014

1
ASCII文字の範囲(0から255)のchrワードですが、unichrはUnicode文字セットに対して機能します。
Shivendra Soni、


9

私の問題のように、複数の文字が単一の整数/ long内にバインドされている場合:

s = '0123456789'
nchars = len(s)
# string to int or long. Type depends on nchars
x = sum(ord(s[byte])<<8*(nchars-byte-1) for byte in range(nchars))
# int or long to string
''.join(chr((x>>8*(nchars-byte-1))&0xFF) for byte in range(nchars))

収量'0123456789'x = 227581098929683594426425L


2
質問してくれてありがとう。base64またはbase58エンコーディングが最も適切であることを考えると、それはOPのユースケースからわずかに外れていることを認めます。タイトルに基づいてこの質問にたどり着きました。整数がASCIIエンコードされたデータがバイトに埋め込まれているように、文字通り整数をASCIIテキストに変換しました。他の人が同じ望ましい結果でここに到着した場合に、私はこの回答を投稿しました。
マシューデイビス

7

URLをエンコードするBASE58はどうですか?たとえば、flickrのように。

# note the missing lowercase L and the zero etc.
BASE58 = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' 
url = ''
while node_id >= 58:
    div, mod = divmod(node_id, 58)
    url = BASE58[mod] + url
    node_id = int(div)

return 'http://short.com/%s' % BASE58[node_id] + url

それを数字に戻すことも大したことではありません。


2
これは素晴らしい。:でも、私はSOにここに別の(より完全な)答えを見つけてしまったstackoverflow.com/questions/1119722/...
mlissner

-1

とを使用hex(id)[2:]int(urlpart, 16)ます。他のオプションがあります。idをbase32エンコードすることもできますが、Pythonに組み込まれているbase32エンコードを実行するライブラリがあることはわかりません。

どうやらbase32エンコーダーがPython 2.4でbase64モジュールとともに導入されたようです。とを使用b32encodeしてみてくださいb32decode。短縮されたURLを人々が書き留める場合に備えてTruecasefoldmap01オプションの両方を指定する必要がありますb32decode

実際、私はそれを取り戻します。私は今でもbase32エンコーディングは良い考えだと思いますが、そのモジュールはURL短縮の場合には役に立ちません。モジュールの実装を見て、この特定のケースのために独自に作成することができます。:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.