受到 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