ip与整型互转
ip与整型互转
先弄清楚大端和小端,网络字节序和主机字节序这些概念。
大端和小端的区别
大端模式(Big-endian):是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;大端模式标准对齐方式和我们的阅读习惯一致
小端模式(Little-endian):是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
网络字节序和主机字节序的区别
通常情况下:网络传输一般采用大端字节序,也被称之为网络字节序,主机字节序是小端字节序;
socket中将ip与整型互转的相关模块
socket.inet_aton(sip) # 将字符ip转换成整型
socket.inet_ntoa(sip_int) # 将整型换成ip
# ntohl, htonl 表示的是网络地址和主机地址之间的转换(network byte <==> host byte)
socket.ntohl() # 网络字节序转主机字节序
socket.htonl() # 主机字节序转网络字节序
struct模块
python中的struct主要是用来处理C结构数据的,读入时先转换为Python的 字符串类型,然后再转换为Python的结构化类型,比如元组(tuple)
struct.pack(fmt,v1,v2,.....) # 打包,返回一个包装后的字符串
struct.unpack(fmt,string) # 解包,返回一个由解包数据(string)得到的一个元组(tuple)
# fmt加上!表示为网络字节序,不加表示为主机字节序
print struct.unpack("I" , socket.inet_aton('192.168.11.153'))[0] # 小端模式标准对齐方式
# 2567678144
print struct.unpack("!I" , socket.inet_aton('192.168.11.153'))[0] # 加上‘!’,网络字节序,大端模式标准对齐方式
#3232238489
print socket.ntohl(struct.unpack("I" , socket.inet_aton('192.168.11.153'))[0]) # 将字符ip转换成整型
#3232238489
print socket.inet_ntoa(struct.pack("I",socket.htonl(3232238489))) # 将整型换成ip
#192.168.11.153
ip地址与整型之间的互相转换有两种方法
方法1
# 将字符ip转换成整型
def sipTohl(sip):
return socket.ntohl(struct.unpack("I" , socket.inet_aton(sip))[0])
# 将整型换成ip
def hlTosip(hip):
return socket.inet_ntoa(struct.pack('I',socket.htonl(hip)))
方法2
# 将字符ip转换成整型
def sipTohl1(sip):
return struct.unpack("!I" , socket.inet_aton(sip))[0]
# 将整型换成ip
def hlTosip1(hip):
return socket.inet_ntoa(struct.pack('!I',hip))
浙公网安备 33010602011771号