【205】Python3 实现整数和IP地址字符串互相转换
解释 IP 地址字符串
IP地址是由三个点分割出的四个数字组成,每个数字的取值范围是 0 到 255(包含 0 和 255)。每个数字都可以转换为一个 8 位的二进制数字。一共 4 个 8 位二进制数字,拼接在一起恰好就是一个 32 位的整数。
IP字符串转换成整数
当 IP 转换为 32 位整数的时候,对字符串分割,切成 4 个数字。
从左往右算:
第 1 个数字二进制左移 8 * 3 = 24 位。
第 2 个数字二进制左移 8 * 2 = 16 位。
第 3 个数字二进制左移 8 位。
第 4 个数字不做移位操作。
最后把四个数字相加,就是从IP字符串转换成的整数。
整数转换成 IP 地址字符串
当整数转换为 IP 地址字符串的时候,32 位的二进制整数分成 4 个 8 位二进制数字,使用按位与取出四个数字的值,然后转换成字符串,由三个点连接在一起。把 4 个数字从左到右划为第一到第四,做如下操作:
第 4 个数字,输入的整数和 255 做按位与,255 是二进制的 11111111(8 个 1),因为高位是0,按位与操作只有低 8 位能取值,其他高位都是0。
第 3 个数字,输入的整数二进制右移 8 位和 255 做按位与,获得数字。
第 2 个数字,输入的整数二进制右移 8 * 2 = 16 位和 255 做按位与,获得数字。
第 1 个数字,输入的整数二进制右移 8 * 3 = 24 位和 255 做按位与,获得数字。
最后把四个数字转换成字符串,中间间隔三个点,拼接在一起就是 IP 地址字符串。
# BEGIN ipToInt(ip)
def ipToInt(ip):ipArr = ip.split(".")ipInt_1 = int(ipArr[0])ipInt_2 = int(ipArr[1])ipInt_3 = int(ipArr[2])ipInt_4 = int(ipArr[3])ipInt_1 = ipInt_1 << (8 * 3)ipInt_2 = ipInt_2 << (8 * 2)ipInt_3 = ipInt_3 << (8 * 1)result = ipInt_1 + ipInt_2 + ipInt_3 + ipInt_4return result
# END ipToInt(ip)# BEGIN intToIp(num)
def intToIp(num):ipInt_4 = num & 255ipInt_3 = (num >> 8) & 255ipInt_2 = (num >> (8 * 2)) & 255ipInt_1 = (num >> (8 * 3)) & 255ipStr_1 = str(ipInt_1)ipStr_2 = str(ipInt_2)ipStr_3 = str(ipInt_3)ipStr_4 = str(ipInt_4)return ipStr_1 + "." + ipStr_2 + "." + ipStr_3 + "." + ipStr_4
# END intToIp(num)a = ipToInt("255.255.255.255")
print(a)
ip = intToIp(a)
print(ip)