Python inet_ntoa 小脚本

用的时候发现这东西居然还要自己写

#!/usr/bin/env python

import socket
import struct
import sys

def Int2Ip(ip):
    return socket.inet_ntoa(struct.pack('!I', ip))

if __name__ == "__main__":
    if len(sys.argv) > 1:
        print Int2Ip(int(sys.argv[1]))

对于多行的文件,可以这么来批量处理

cat ip.txt | xargs -i  ./Int2Ip.py {}

——————————–

2014-4-6 15:36:42 update

http://hi.baidu.com/wg_wang/it…

在工作中需要将ip地址从整数(如168442432)到以点号分隔的字符串类型(如10.10.58.64)之间的转换,或者反过来从字符串到整数的转换。这个转换可以使用的方式很多,例如,linux下的C语言编程,调用inet_aton等函数就可以方便的实现(参考man inet_aton)。不过,脚本语言可以提供更加快速的方式实现,在python中,如下:

首先:
import socket
import struct

字符串到整数的转换:
socket.ntohl(struct.unpack(‘i’,socket.inet_aton(“10.10.58.64”))[0])

更新版,结果都为正整数,前面这个当结果ip地址为128.0.0.0及其以上时,结果会表示为负数。
struct.unpack(‘I’,struct.pack(‘i’,(socket.ntohl(struct.unpack(‘i’, socket.inet_aton(“201.119.123.249”))[0]))))[0]

整数到字符串的转换:
socket.inet_ntoa(struct.pack(‘i’,socket.htonl(980942848 )))

各个函数的功能可以参考python的文档,例如:
>>> help(struct.pack)
pack(fmt, *args)
Return string containing values v1, v2, … packed according to fmt.
See struct.__doc__ for more on format strings.

更详细的可以参考python documentation,有联机版的,也有脱机版的,在windows安装python2.5时还附带chm的文档。

20091117更新
如果在c/c++程序中用inet_aton和inet_ntoa进行转换的,int类型和字符串类型的对应关系,在python中还原的话,则无须进行网络主机字节序(host byte order)到网络字节序(network byte order)之间的转换,或者反过来主机字节序到网络字节序的转换。这样,转换的语句如下:
socket.inet_ntoa(struct.pack(‘I’, 1077545482))
struct.unpack(‘I’,socket.inet_aton(“10.10.58.64”))[0]

对应的c程序分别为:
18 #include
19 #include
20 #include
21 #include
22 #include
23 #include
24
25 int main(int argc, char ** argv)
26 {
27 if ( argc != 2 )
28 {
29 fprintf(stderr, “error argument\nusage: %s int_ip\n”, argv[0]);
30 return -1;
31 }
32
33 struct in_addr in;
34 long a=atol(argv[1]);
35 in.s_addr=(unsigned int)(a);
36 fprintf(stdout, “%u <--> %s\n”, in.s_addr, inet_ntoa(in));
37 return 0;
38 }

18 #include
19 #include
20 #include
21
22 int main(int argc, char *argv[])
23 {
24 struct in_addr addr;
25 if (argc != 2)
26 {
27 fprintf(stderr, “argument wrong\nusage: %s \n”, argv[0]);
28 return -1;
29 }
30 if (inet_aton(argv[1], &addr) == 0) {
31 fprintf(stderr, “inet_aton”);
32 }
33
34 fprintf(stdout, “%s <--> %u\n”, argv[1], addr.s_addr);
35 return 0;
36 }

Leave a Reply

Your email address will not be published. Required fields are marked *