Chuyển đổi int thành ASCII và quay lại bằng Python


137

Tôi đang làm việc để tạo một trình rút ngắn URL cho trang web của mình và gói hiện tại của tôi (tôi đang mở để đề xuất) là sử dụng ID nút để tạo URL rút ngắn. Vì vậy, về mặt lý thuyết, nút 26 có thể là short.com/z, nút 1 có thể là short.com/a, nút 52 có thể là short.com/Zvà nút 104 có thể là short.com/ZZ. Khi người dùng truy cập URL đó, tôi cần đảo ngược quá trình (rõ ràng).

Tôi có thể nghĩ ra một số cách hay để giải quyết vấn đề này, nhưng tôi đoán có những cách tốt hơn. Bất kỳ đề xuất?


Câu trả lời:


239

ASCII đến int:

ord('a')

cho 97

Và quay lại một chuỗi:

  • trong Python2: str(unichr(97))
  • trong Python3: chr(97)

cho 'a'


82
và chỉ chr () trong python3!
Ehsan M. Kermani

1
từ chr trong phạm vi của các ký tự ascii (0 - 255), tuy nhiên, unichr hoạt động cho bộ ký tự unicode.
Shivendra Soni


9

Nếu nhiều ký tự bị ràng buộc bên trong một số nguyên / dài, thì đó là vấn đề của tôi:

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))

Sản lượng '0123456789'x = 227581098929683594426425L


2
Cam ơn vi đa hỏi. Tôi sẽ cấp một chút cho trường hợp sử dụng trong OP, với điều kiện là mã hóa base64 hoặc base58 sẽ được áp dụng nhiều nhất. Tôi đã đến câu hỏi này dựa trên tiêu đề, chuyển đổi một số nguyên thành văn bản ascii như thể số nguyên có dữ liệu được mã hóa ascii được nhúng trong các byte của nó. Tôi đã đăng câu trả lời này trong trường hợp những người khác đến đây với kết quả mong muốn tương tự.
Matthew Davis

7

Điều gì về BASE58 mã hóa URL? Ví dụ như flickr không.

# 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

Biến nó trở lại thành một con số cũng không phải là một vấn đề lớn.


2
Điều đó thật tuyệt.
Cuối

-1

Sử dụng hex(id)[2:]int(urlpart, 16). Có những lựa chọn khác. mã hóa base32 id của bạn cũng có thể hoạt động, nhưng tôi không biết rằng có bất kỳ thư viện nào mã hóa base32 được tích hợp trong Python.

Rõ ràng một bộ mã hóa base32 đã được giới thiệu trong Python 2.4 với mô-đun base64 . Bạn có thể thử sử dụng b32encodeb32decode. Bạn nên cung cấp Truecho cả casefoldmap01các tùy chọn b32decodetrong trường hợp mọi người viết ra các URL rút ngắn của bạn.

Thật ra, tôi lấy lại cái đó. Tôi vẫn nghĩ mã hóa base32 là một ý tưởng tốt, nhưng mô-đun đó không hữu ích cho trường hợp rút ngắn URL. Bạn có thể nhìn vào việc thực hiện trong mô-đun và làm cho riêng bạn cho trường hợp cụ thể này. :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.