web-dev-qa-db-ja.com

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

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

これについてはいくつかの気の利いた方法を考えることができますが、もっと良い方法があると思います。助言がありますか?

117
mlissner

ASCIIからint:

ord('a')

97を与える

そして、文字列に戻ります。

  • python2の場合:str(unichr(97))
  • python3の場合:str(chr(97))

'a'を与える

204
>>> ord("a")
97
>>> chr(97)
'a'
82
renatov

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

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を生成します

7
Matthew Davis

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

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

6
Ivo Wetzel