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
'programing' 카테고리의 다른 글
Android 전화기 모델을 프로그래밍 방식으로 가져오기, Android에서 장치 이름과 모델을 프로그래밍 방식으로 가져오는 방법은 무엇입니까? (0) | 2023.07.20 |
---|---|
아무것도 하지 않는 파이썬 패스 문에 해당하는 자바스크립트가 있습니까? (0) | 2023.07.20 |
MongoDB는 두 필드의 문자열을 세 번째 필드로 연결합니다. (0) | 2023.07.15 |
Gitbash 오류: 하위 프로세스를 포크할 수 없습니다.사용 가능한 터미널이 없습니다(-1). (0) | 2023.07.15 |
MariaDB JSON 제약 조건 추가 방법 (0) | 2023.07.15 |