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))

posted on 2021-05-13 10:20  xufat  阅读(490)  评论(0)    收藏  举报

导航

/* 返回顶部代码 */ TOP