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/item/338dbb3913ce5a617c034bfc

在工作中需要将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 }

使用 Hugo 构建
主题 StackJimmy 设计