[祖传代码] IPV4地址点分十进制与整数形式相互转化 (Python 3)

受到 scapy.utils.ltoa() 这个函数的启发,想贴一段祖传代码。

IPV4的地址,可以用点分十进制表示,例如:192.168.10.121。与之对应,可以用一个整形数字表示:3232238201。将整数转化成十六进制形式的简单过程是:

hex(3232238201) >>>变>>> 0xc0a80a79 >>>变>>> c0_a8_0a_79 >>>变>>> 192_168_10_121

为实现这两种形式的转换,给出两个祖传函数:

## 输入:整型IPV4地址。例如:3232238201
## 输出:点分十进制字符串IPV4地址。例如:192.168.10.121
## 异常:输入的整数不是一个IPV4地址。
def bytes_2_Dotted_Decimal_Notation(bytes_network):
    #IPV4 address, like 192.168.0.1, 8 bytes
    if (bytes_network <= 0 or bytes_network >= 0xFFFFFFFF):
        raise ValueError("illegal network value", hex(bytes_network))
    ls = [ ]
    for i in range(4):
        ls.append (str( bytes_network & 0xFF))
        bytes_network = bytes_network >> 8
    ls.reverse()
    return ".".join(ls)

## 输入:点分十进制字符串IPV4地址。例如:192.168.10.121
## 输出:整型IPV4地址。例如:3232238201
## 异常:输入的字符串不是一个IPV4地址。      
def dotted_Decimal_Notation_2_Bytes(ddn_network):
    #根据IPV4地址的点分十进制形式,得到整数形式
    ls =ddn_network.split('.')
    result = 0
	    for i in ls:
        if int(i) <0 or int(i)>255:
            raise ValueError("illegal network value", ddn_network)
        result = result <<8 | int(i)
    return result

你可能感兴趣的:(网络,实践)