美文网首页
如何将IP地址转换成为一个整数

如何将IP地址转换成为一个整数

作者: 莫辜负自己的一世韶光 | 来源:发表于2018-11-22 19:27 被阅读0次

    请编写一个函数实现将IP地址转换为一个整数.

    • 首先要明白转换的思路.
      IP地址是一个点分十进制的字符串例如:127.1.1.1
      首先是将这个IP地址按照.进行分隔,然后每部分都表示成二进制形式.
      最后再将这些二进制的字符串进行拼接,进而转换为int类型.
    # encoding:utf-8
    __author__ = 'Fioman'
    __date__ = '2018/11/19 8:37'
    import socket
    import struct
    
    
    # IP地址转换为int
    # 思路IP按照split进行分隔成4个部分,然后每个部分都转换为二进制类型.
    # 然后将这些二进制进行拼接成一个32位的大的二进制字符串.
    # 最后将这个二进制数,转换成对应的int类型
    def ipToInt(ip_str):
        # 分隔
        ip_list = ip_str.split('.')
    
        # 拼接
        bin_str = ""
        # 遍历,然后求出每一个二进制数,(注意切割,舍弃0b),还要把它弄成8位.再相加
        for i in ip_list:
            part = bin(int(i))[2:]
            # 将part前面补充0
            part = part.zfill(8)
            bin_str += part
    
        # 最后将这个二进制数转换为整数
        ip_int = int(bin_str, 2)
    
        return ip_int
    
    
    # 另外一种方法,通过内置模块socket模块
    def ipToInt2(ip_str):
        # 首先将ip地址字符串转换为整型,使用inet_aton
        ret = socket.ntohl(struct.unpack('I', socket.inet_aton(str(ip)))[0])
        return ret
    
    
    # 将int类型的数,先转换为32位的二进制数.然后按8位进行分隔.每八位表示一个IP的一部分即可.
    def intToIp(ip_int):
        ip_bin = bin(ip_int)[2:]
        ip_bin = ip_bin.zfill(32)
    
        bin_list = []
        ip_str = []
    
        for i in range(0, 32, 8):
            bin_list.append(ip_bin[i:i + 8])
    
        for temp in bin_list:
            ip_str.append(str(int(temp, 2)))
    
        ret = ".".join(ip_str)
        return ret
    
    
    # 第二种通过内置模块完成,将整型转换为IP地址格式地址
    def intToIp2(ip):
        ret = socket.inet_ntoa(struct.pack("I", socket.htonl(ip)))
        return ret
    
    
    if __name__ == '__main__':
        ip = '7.91.205.21'
        print(ipToInt(ip))
    
        print(ipToInt2('7.91.205.21'))
    
        print(intToIp(123456789))
        print(intToIp2(123456789))
    
    

    还有一种通过位移的方式

    请编写一个函数实现将IP地址转换成一个整数。
    如 10.3.9.12 转换规则为:
            10            00001010
             3            00000011
             9            00001001
            12            00001100
    再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
    
    
    def v1(addr):
        # 取每个数
        id = [int(x) for x in addr.split(".")]
        print(id)
        return sum(id[i] << [24, 16, 8, 0][i] for i in range(4))
    
    print(v1("127.0.0.1"))
    
    # [127, 0, 0, 1]
    # 2130706433
    

    总结,可以通过分步拆分,或者是位移的方式来进行解决这类问题.

    相关文章

      网友评论

          本文标题:如何将IP地址转换成为一个整数

          本文链接:https://www.haomeiwen.com/subject/dydifqtx.html