แปลง int เป็น ASCII และกลับมาใน Python


145

ฉันกำลังดำเนินการสร้างตัวย่อ URL สำหรับไซต์ของฉันและแผนปัจจุบันของฉัน (ฉันเปิดรับข้อเสนอแนะ) คือการใช้ ID โหนดเพื่อสร้าง URL แบบย่อ ดังนั้นในทางทฤษฎีโหนด 26 อาจจะมีshort.com/zโหนด 1 อาจจะมีshort.com/aโหนด 52 อาจจะมีshort.com/Zและโหนด 104 short.com/ZZอาจจะมี เมื่อผู้ใช้ไปที่ URL นั้นฉันจำเป็นต้องย้อนกระบวนการ (ชัดเจน)

ฉันคิดวิธีที่ไม่ดีในการดำเนินการนี้ได้ แต่ฉันเดาว่ามีวิธีที่ดีกว่านี้ ข้อเสนอแนะใด ๆ ?

คำตอบ:


250

ASCII ถึง int:

ord('a')

ให้ 97

และกลับไปที่สตริง:

  • ใน Python2: str(unichr(97))
  • ใน Python3: chr(97)

ให้ 'a'


82
และเพียงแค่ chr () ใน python3!
Ehsan M. Kermani

1
คำ chr ในช่วงของอักขระ ascii (0-255) อย่างไรก็ตาม unichr ใช้งานได้กับชุดอักขระ Unicode
Shivendra Soni


10

หากอักขระหลายตัวถูกผูกไว้ภายในจำนวนเต็ม / ยาวเดียวเช่นเดียวกับปัญหาของฉัน:

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
ขอบคุณที่ถาม. ฉันจะให้มันเล็กน้อยจากกรณีการใช้งานใน OP เนื่องจากการเข้ารหัส base64 หรือ base58 จะใช้ได้มากที่สุด ฉันมาถึงคำถามนี้ตามชื่อเรื่องการแปลงจำนวนเต็มเป็นข้อความ ascii อย่างแท้จริงราวกับว่าจำนวนเต็มมีข้อมูลที่เข้ารหัส ascii ฝังอยู่ในไบต์ ฉันโพสต์คำตอบนี้ในกรณีที่คนอื่นมาที่นี่พร้อมกับผลลัพธ์ที่ต้องการเช่นเดียวกัน
Matthew Davis

7

BASE58 เข้ารหัส URL เป็นอย่างไร เช่นเดียวกับตัวอย่างที่ 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). มีตัวเลือกอื่น ๆ การเข้ารหัส base32 id ของคุณก็ใช้ได้เช่นกัน แต่ฉันไม่รู้ว่ามีไลบรารีใด ๆ ที่เข้ารหัส base32 ใน Python

เห็นได้ชัดว่าเข้ารหัส base32 ได้รับการแนะนำในหลาม 2.4 กับโมดูล base64 คุณอาจลองใช้b32encodeและb32decode. คุณควรให้Trueทั้งตัวเลือกcasefoldและmap01ตัวเลือกb32decodeในกรณีที่มีคนจด URL แบบย่อของคุณ

อันที่จริงฉันเอาคืน ฉันยังคิดว่าการเข้ารหัส base32 เป็นความคิดที่ดี แต่โมดูลนั้นไม่มีประโยชน์สำหรับกรณีของการย่อ URL คุณสามารถดูการใช้งานในโมดูลและสร้างขึ้นเองสำหรับกรณีนี้โดยเฉพาะ :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.