programing

ASCII로 변환했다가 Python에서 다시 변환

goodsources 2023. 7. 15. 10:05
반응형

ASCII로 변환했다가 Python에서 다시 변환

저는 제 사이트의 URL 단축키를 만드는 작업을 하고 있으며, 현재 제 계획은 노드 ID를 사용하여 단축된 URL을 생성하는 것입니다.그래서, 이론적으로, 노드 26은 아마도short.com/z노드 1은 다음과 같습니다.short.com/a노드 52는 아마도short.com/Z그리고 104번 노드는short.com/ZZ사용자가 해당 URL로 이동할 때 프로세스를 되돌려야 합니다.

이 문제를 해결할 방법을 생각해 낼 수는 있지만, 더 나은 방법이 있을 것 같습니다.좋은 의견이라도 있나?

ASCII to int:

ord('a')

기브즈97

그리고 문자열로 돌아갑니다.

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

기브즈'a'

>>> ord("a")
97
>>> chr(97)
'a'

여러 문자가 하나의 정수/긴 길이 내에 바인딩된 경우 문제가 발생했습니다.

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

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

그것을 다시 숫자로 바꾸는 것도 큰 문제가 아닙니다.

사용하다hex(id)[2:]그리고.int(urlpart, 16)다른 옵션도 있습니다. base32 인코딩은 당신의 id도 작동할 수 있지만, 저는 Python에 base32 인코딩을 하는 라이브러리가 있는지 모릅니다.

Base32 인코더는 Base64 모듈과 함께 Python 2.4에 도입되었습니다.사용해 보십시오.b32encode그리고.b32decode당신은 주어야 합니다.True둘 다를 위하여casefold그리고.map01에 대한 옵션.b32decode사람들이 당신의 단축된 URL을 적을 경우.

사실, 취소할게요.저는 여전히 base32 인코딩이 좋은 생각이라고 생각하지만, 그 모듈은 URL 단축의 경우에 유용하지 않습니다.모듈의 구현을 보고 이 특정 사례에 대해 직접 만들 수 있습니다. :-)

파티에 늦은 것 같습니다. 제가 자주 사용하는 스니펫을 공유하는 것을 좋아합니다.

/**
 * 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;
}

언급URL : https://stackoverflow.com/questions/3673428/convert-int-to-ascii-and-back-in-python

반응형