185 votes

Convertir int en ASCII et inversement en Python

Je travaille à la création d'un raccourcisseur d'URL pour mon site, et mon plan actuel (je suis ouvert aux suggestions) est d'utiliser un ID de nœud pour générer l'URL raccourci. Donc, en théorie, le nœud 26 pourrait être short.com/z le nœud 1 pourrait être short.com/a le nœud 52 peut être short.com/Z et le nœud 104 peut être short.com/ZZ . Lorsqu'un utilisateur se rend à cette URL, je dois inverser le processus (évidemment).

Je peux penser à des façons maladroites de procéder, mais je suppose qu'il y en a de meilleures. Vous avez des suggestions ?

0voto

paxdiablo Points 341644

J'utiliserais simplement un code comme le suivant pour mettre en place deux tables de conversion, l'une de node à ASCII, l'autre dans l'autre sens.

L'exemple de code ci-dessous fournit 36 pour un seul caractère, 1,332 pour un maximum de deux caractères, 47,998 pour un maximum de trois caractères et un énorme 1,727,604 pour un maximum de quatre caractères, mais vous devez commencer à vous méfier de la taille des tables à ce stade (la conversion au moment de l'exécution, plutôt que le précalcul des tables de recherche, peut être une meilleure option si vous en arrivez à ce stade).

N'oubliez pas qu'il s'agissait uniquement de chiffres et de lettres minuscules. Si vous décidez d'utiliser des majuscules, les quantités sont les suivantes :

length = 1     node count =         62
         2                       3,906
         3                     242,234
         4                  15,018,570

Un exemple de code est donné ci-dessous :

nd_to_asc = []
asc_to_nd = {}
full_range = range(48,58) + range(97,123)

# One, two, three and four-length codes.

for p1 in full_range:
    nd_to_asc.append (chr(p1))
    for p2 in full_range:
        nd_to_asc.append ("%s%s"%(chr(p1),chr(p2)))
        for p3 in full_range:
            nd_to_asc.append ("%s%s%s"%(chr(p1),chr(p2),chr(p3)))
            for p4 in full_range:
                nd_to_asc.append ("%s%s%s%s"%(chr(p1),chr(p2),chr(p3),chr(p4)))

# Reverse lookup.
for i in range(len(nd_to_asc)):
  asc_to_nd[nd_to_asc[i]] = i

print len(nd_to_asc)

0voto

Li Wang Points 13

Apparemment, je suis en retard, mais j'aimerais partager un extrait que j'utilise très souvent.

/**
 * 62 = 26 + 26 +10
 *
 * @param id
 * @return
 */
public String base62(long id) {
    StringBuilder sb = new StringBuilder();
    while (id >= 62) {
        int remainer = (int) (id % 62);
        id = id / 62;
        sb.append(index2char(remainer));
    }
    sb.append(index2char(id));

    return sb.reverse().toString();
}

public long reverseBase62(String s) {
    long r = 0;
    for (int i = 0; i < s.length(); i++) {
        r = r * 62;
        int index = char2index(s.charAt(i));
        if (index == -1) {
            throw new IllegalArgumentException(
                String.format("[%s] is in malformation, should only contain 0~9, a~z, A~Z", s));
        }
        r += index;
    }

    return r;
}
private char index2char(long index) {
    if (index < 10) {
        return (char) ('0' + index);
    }
    if (index < 36) {
        return (char) ('a' + index - 10);
    }
    return (char) ('A' + index - 36);
}

private int char2index(char c) {
    if ('0' <= c && c <= '9') {
        return c - '0';
    }
    if ('a' <= c && c <= 'z') {
        return c - 'a' + 10;
    }
    if ('A' <= c && c <= 'Z') {
        return c - 'A' + 36;
    }
    return -1;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X