[祖傳代碼] 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章