python IP 주소 정수 변환

3053 단어 pythonip주소
배경
오늘 어떤 사람이 나에게 "왜 데이터베이스에서 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 주소 정수에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기