파이썬에서 int를 ASCII로 변환하고 다시 변환하십시오.


137

내 사이트의 URL 단축기를 만드는 중이고 현재 계획 (제안 할 수 있음)은 단축 된 URL을 생성하기 위해 노드 ID를 사용하는 것입니다. 따라서 이론적으로 노드 26은 short.com/z노드 1 일 수 short.com/a있고 노드 52는 short.com/Z노드 104가 될 수 있습니다 short.com/ZZ. 사용자가 해당 URL로 이동하면 프로세스를 취소해야합니다 (분명히).

나는 이것에 대해 갈만한 몇 가지 방법을 생각할 수 있지만 더 좋은 방법이 있다고 생각합니다. 어떤 제안?


답변:


239

ASCII에서 int로 :

ord('a')

준다 97

그리고 다시 문자열로 :

  • Python2에서 : str(unichr(97))
  • Python3에서 : chr(97)

준다 'a'


82
그리고 python3에서 단지 chr ()!
Ehsan M. Kermani 1

1
그러나 ASCII 문자 범위 (0-255)의 chr 단어는 유니 코드 문자 집합에 대해 작동합니다.
Shivendra Soni


9

여러 문자가 단일 정수 / 길이 안에 묶인 경우 내 문제는 다음과 같습니다.

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 텍스트로 변환했습니다. 다른 사람들이 여기에 도착했을 때 동일한 결과를 얻은 경우이 답변을 게시했습니다.
Matthew Davis

7

URL을 인코딩하는 BASE58은 어떻습니까? 예를 들어 플리커는 그렇습니다.

# 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로 인코딩해도 작동 할 수는 있지만 파이썬에 base32 인코딩을 수행하는 라이브러리가 있다는 것을 모르겠습니다.

분명히 base32 인코더는 base64 모듈 과 함께 Python 2.4에 도입되었습니다 . b32encode및을 사용해보십시오 b32decode. 사람들이 단축 URL을 작성하는 경우를 대비 True하여 casefoldmap01옵션을 모두 제공해야 b32decode합니다.

사실, 나는 그것을 다시 가져갑니다. 나는 여전히 base32 인코딩이 좋은 생각이라고 생각하지만 그 모듈은 URL 단축의 경우에는 유용하지 않습니다. 모듈에서 구현을 살펴보고이 특정 사례에 대해 직접 만들 수 있습니다. :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.