2010-08-12 119 views
1

我想将从十进制格式文件(192.168.65.72)中读取的IP地址转换为二进制格式{110000001010100001000001010001000}。我正在从文件中读取十进制格式的IP地址找到下面的代码片段。使用Python进行IP地址转换

/*contains 192.168.65.72*/ 
filter = open("filter.txt", "r") 

for line in filter: 
    bytePattern = "([01]?\d\d?|2[0-4]\d|25[0-5])" 
    regObj = re.compile("\.".join([bytePattern]*4)) 
    for match in regObj.finditer(line): 
     m1,m2,m3,m4 = match.groups() 
     print "%s %s %s %s" %(m1, m2, m3, m4) 

我想转换M1,M2,M3和M4每进一个8位二进制value.I不能想出一个办法做到that.I是新来python.Any帮助将不胜感激。

干杯。

+2

我猜你是要么将IP地址作为一个普通的旧的32位整数,要么你想要4个字节的数据保存一个IP地址。我怀疑你实际上并不想要一个包含32个1和0的字符串。 – Omnifarious 2010-08-12 06:23:10

回答

4
''.join([ bin(int(x))[2:].rjust(8,'0') for x in '123.123.123.123'.split('.')]) 
+0

请注意所需的填充。无论值如何,IP中的每个字节都需要用8位表示。 – poke 2010-08-12 06:14:16

+0

@poke哦是的,谢谢提醒:)我现在就做。 – 2010-08-12 06:15:01

+2

'''.join('bin(256 + int(x))[3:] for'123.123.123.123'.split('。')])' – Omnifarious 2010-08-12 06:17:16

1
>>> bin(192) 
'0b11000000' 

其余的字符串操作。但是请注意,在一个IP中,除了第一部分外,所有部分都允许为零。

2

如果你想包含原始数据的32位IP地址的字符串:

import struct 
struct.pack('4B', *(int(x) for x in '123.123.123.123'.split('.'))) 

或者,如果你想包含IP地址的32位整数:

import struct 
struct.unpack('>I', struct.pack('4B', *(int(x) for x in '123.123.123.123'.split('.')))) 
4

将IPv4地址从点分四字符串格式(例如“123.45.67.89”)转换为32位打包二进制格式:

socket.inet_aton("192.168.65.72")

+0

它返回'\ xc0 \ xa8AH' – avi 2013-12-03 05:21:41

+0

@avi:是的,这是正确的。这是代表4个字节的字符串字面值。我建议你切换到Python3,它应该更正确地返回字节文字。 – 2013-12-04 08:53:35