python IP 주소 정수 변환
오늘 어떤 사람이 나에게 "왜 데이터베이스에서 int 형식으로 IP 주소를 저장하는 것을 추천합니까?"라고 물었다.현재(2020년)를 보면 이 물건은 좀 유행이 지났다. 한편으로는 디스크 공간이 그렇게 비싸지 않고, 다른 한편으로는 IPv6가 이 법칙과 호환되지 않는다.
IPv4 주소를 정수로 바꾸는 원리와 수익이 무엇인지 살펴본다.
전환의 원리
하나의 IPv4 클래스의 주소는 모두 네 부분으로 0.0.0.0으로 나뉘지만 각 부분의 수치 범위는 0~255이다.즉, 모든 부분은 한 바이트로 저장할 수 있다. 모두 한 바이트로 쓰면 된다. 네 바이트가 int 아닌가?
첫 번째 단계는 IP 주소의 각 부분을 한 바이트로 바꾸고 그것들을 연결하면 4바이트의 열을 얻을 수 있다.
import struct
def aton(ip_address: str) -> bytes:
result = []
for i in ip_address.split('.'):
result.append(struct.pack("!B", int(i)))
return b''.join(result)
두 번째 단계는 바이트 열을 정수로 변환한다.
In [2]: aton("127.0.0.1")
Out[2]: b'\x7f\x00\x00\x01'
In [3]: int.from_bytes(b'\x7f\x00\x00\x01','big')
Out[3]: 2130706433
이렇게 해서 우리는 IPv4 주소를 하나의 정수로 바꾸었다. 완전한 코드는 다음과 같다.
import struct
def aton(ip_address: str) -> bytes:
result = []
for i in ip_address.split('.'):
result.append(struct.pack("!B", int(i)))
return b''.join(result)
if __name__ == "__main__":
bts = aton("127.0.0.1")
print(int.from_bytes(bts, 'big'))
실행 효과는 다음과 같습니다.
python3 main.py
2130706433
전환 수익과 제한변환을 하지 않으면 varchar를 사용하여 IPv4 주소를 저장할 수 있습니다. 그러면 15(3*4+3)바이트가 필요합니다.변환을 하려면 4바이트만 있으면 됩니다. 디스크 공간을 절약하면 cpu 시간을 많이 사용할 수 있습니다.
오늘날 IPv6는 이미 주류로 그 길이가 이전의 4바이트에서 16바이트로 직접 올랐다.int는 더 이상 수요를 만족시킬 수 없습니다. 이 두 가지 유형의 IP를 통일적으로 처리할 수 있도록 현재 varchar를 사용하여 저장하는 것을 추천합니다.
inet_aton과 inet_ntoa
이 IP 쌍은 IPv4 시대의 변환 함수로서 현재로서는 시대에 뒤떨어졌다.
1、inet_aton IP 전환.
In [4]: socket.inet_aton("127.0.0.1")
Out[4]: b'\x7f\x00\x00\x01'
2、inet_ntoa 디지털 IP 전환.
In [5]: socket.inet_ntoa(b'\x7f\x00\x00\x01')
Out[5]: '127.0.0.1'
inet_pton과 inet_ntop이것은 IPv4와 IPv6를 호환하는 새로운 API 쌍입니다.
In [6]: socket.inet_pton(socket.AF_INET6,"5aef:2b::8")
Out[6]: b'Z\xef\x00+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08'
In [7]: socket.inet_ntop(socket.AF_INET6,b'Z\xef\x00+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08')
Out[7]: '5aef:2b::8'
In [8]: socket.inet_pton(socket.AF_INET,"127.0.0.1")
Out[8]: b'\x7f\x00\x00\x01'
In [9]: socket.inet_ntop(socket.AF_INET,b'\x7f\x00\x00\x01')
Out[9]: '127.0.0.1'
이상은python IP 주소 정수에 대한 상세한 내용입니다.python IP 주소 정수에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.