Не беспокойтесь о кодировании их в 64 бит. Адрес IPv4 - 32 бита (4 байта). Если вы напишете два файла в файл, размер будет 8 байтов.
Использования socket.inet_aton
для преобразования удобочитаемого IP-адреса строки к упакованной бинарной сырой 4-байтовой строке:
import socket
ip_addrs = ["168.2.65.33", "192.4.2.55"]
with open('data.out', 'wb') as f:
for ip in ip_addrs:
raw = socket.inet_aton(ip)
f.write(raw)
Результат:
$ hexdump -Cv data.out
00000000 a8 02 41 21 c0 04 02 37 |..A!...7|
00000008
Комплементарное преобразование функция socket.inet_ntoa
будет преобразовывать упакованную 4-байтную строку обратно в человеко-читаемый IP-адрес.
Вот пример написания и чтения их обратно:
import socket
ip_pairs = [
('1.1.1.1', '1.1.1.2'),
('2.2.2.2', '2.2.2.3'),
('3.3.3.3', '3.3.3.4'),
]
# Write them out
with open('data.out', 'wb') as f:
for ip1, ip2 in ip_pairs:
raw = socket.inet_aton(ip1) + socket.inet_aton(ip2)
f.write(raw)
def read_with_eof(f, n):
res = f.read(n)
if len(res) != n:
raise EOFError
return res
# Read them back in
result = []
with open('data.out', 'rb') as f:
while True:
try:
ip1 = socket.inet_ntoa(read_with_eof(f, 4))
ip2 = socket.inet_ntoa(read_with_eof(f, 4))
result.append((ip1, ip2))
except EOFError:
break
print 'Input:', ip_pairs
print 'Result:', result
Выход:
$ python pairs.py
Input: [('1.1.1.1', '1.1.1.2'), ('2.2.2.2', '2.2.2.3'), ('3.3.3.3', '3.3.3.4')]
Result: [('1.1.1.1', '1.1.1.2'), ('2.2.2.2', '2.2.2.3'), ('3.3.3.3', '3.3.3.4')]
@Hurkyl Спасибо. Исправлена. – eleanora