python实现IP进制格式转换

原文:http://www.freebuf.com/sectool/140982.html

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""
各种进制的IP表示及其它们的组合
"""
import socket
import struct
import itertools
def ip_split_by_comma_oct(ip):
    """
    :param ip:
    :return:
    """
    parsed_result = set()
    ip_split = str(ip).split('.')
    ip_split_oct = [oct(int(_)) for _ in ip_split]
    parsed_result.add('.'.join(ip_split_oct))
    return parsed_result
def ip_split_by_comma_hex(ip):
    """
    :param ip:
    :return:
    """
    parsed_result = set()
    ip_split = str(ip).split('.')
    ip_split_hex = [hex(int(_)) for _ in ip_split]
    parsed_result.add('.'.join(ip_split_hex))
    return parsed_result
def combination_oct_int_ip(ip):
    """
    :param ip:
    :return:
    """
    result = set()
    parsed_result = set()
    ip_split = str(ip).split('.')
    oct_2 = list(itertools.combinations([0, 1, 2, 3], 2))
    oct_3 = list(itertools.combinations([0, 1, 2, 3], 3))
    for n, _ in enumerate(ip_split):
        _tmp = oct(int(_))
        _delete = ip_split[:n] + ip_split[n+1:]
        _delete.insert(n, _tmp)
        result.add(tuple(_delete))
    for _ in oct_2:
        _tmp_ip = ip_split[:]
        _tmp1 = oct(int(ip_split[_[0]]))
        _tmp2 = oct(int(ip_split[_[1]]))
        del _tmp_ip[_[0]]
        del _tmp_ip[_[1] - 1]
        _tmp_ip.insert(_[0], _tmp1)
        _tmp_ip.insert(_[1], _tmp2)
        result.add(tuple(_tmp_ip))
    for _ in oct_3:
        _tmp_ip = ip_split[:]
        _tmp1 = oct(int(ip_split[_[0]]))
        _tmp2 = oct(int(ip_split[_[1]]))
        _tmp3 = oct(int(ip_split[_[2]]))
        del _tmp_ip[_[0]]
        del _tmp_ip[_[1] - 1]
        del _tmp_ip[_[2] - 2]
        _tmp_ip.insert(_[0], _tmp1)
        _tmp_ip.insert(_[1], _tmp2)
        _tmp_ip.insert(_[2], _tmp3)
        result.add(tuple(_tmp_ip))
    for _ in result:
        parsed_result.add('.'.join(_))
    return parsed_result
def combination_hex_int_ip(ip):
    """
    :param ip:
    :return:
    """
    result = set()
    parsed_result = set()
    ip_split = str(ip).split('.')
    hex_2 = list(itertools.combinations([0, 1, 2, 3], 2))
    hex_3 = list(itertools.combinations([0, 1, 2, 3], 3))
    for n, _ in enumerate(ip_split):
        _tmp = hex(int(_))
        _delete = ip_split[:n] + ip_split[n+1:]
        _delete.insert(n, _tmp)
        result.add(tuple(_delete))
    for _ in hex_2:
        _tmp_ip = ip_split[:]
        _tmp1 = hex(int(ip_split[_[0]]))
        _tmp2 = hex(int(ip_split[_[1]]))
        del _tmp_ip[_[0]]
        del _tmp_ip[_[1] - 1]
        _tmp_ip.insert(_[0], _tmp1)
        _tmp_ip.insert(_[1], _tmp2)
        result.add(tuple(_tmp_ip))
    for _ in hex_3:
        _tmp_ip = ip_split[:]
        _tmp1 = hex(int(ip_split[_[0]]))
        _tmp2 = hex(int(ip_split[_[1]]))
        _tmp3 = hex(int(ip_split[_[2]]))
        del _tmp_ip[_[0]]
        del _tmp_ip[_[1] - 1]
        del _tmp_ip[_[2] - 2]
        _tmp_ip.insert(_[0], _tmp1)
        _tmp_ip.insert(_[1], _tmp2)
        _tmp_ip.insert(_[2], _tmp3)
        result.add(tuple(_tmp_ip))
    for _ in result:
        parsed_result.add('.'.join(_))
    return parsed_result
def combination_hex_int_oct_ip(ip):
    """
    :param ip:
    :return:
    """
    result = set()
    parsed_result = set()
    ip_split = str(ip).split('.')
    hex_3 = list(itertools.combinations([0, 1, 2, 3], 3))
    for n1, n2, n3 in hex_3:
        _tmp_ip = ip_split[:]
        _tmp_2 = oct(int(_tmp_ip[n2]))
        _tmp_3 = hex(int(_tmp_ip[n3]))
        del _tmp_ip[n2]
        del _tmp_ip[n3 - 1]
        _tmp_ip.insert(n2, _tmp_2)
        _tmp_ip.insert(n3, _tmp_3)
        result.add(tuple(_tmp_ip))
    for _ in result:
        parsed_result.add('.'.join(_))
    return parsed_result
if __name__ == '__main__':
    ip = '10.1.100.1'
    ip_int = struct.unpack('!L', socket.inet_aton(ip))[0]
    ip_oct_no_comma = oct(ip_int)
    ip_hex_no_comma = hex(ip_int)
    ip_oct_by_comma = ip_split_by_comma_oct(ip)
    ip_hex_by_comma = ip_split_by_comma_hex(ip)
    all_result = ip_oct_by_comma | ip_hex_by_comma | combination_oct_int_ip(ip) | combination_hex_int_ip(ip) | combination_hex_int_oct_ip(ip)
    for _ip in all_result:
        print _ip

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天读完整本书,发现虽然表面上作者再告诉你如何成为“富人”,但其实是要告诉你,如何做财务自由的更优秀的自己...
    左客阅读 264评论 2 0
  • 口字湖畔,殘藤繞樹。 向陽橋上,枯木逢春。 定林...
    树先森6阅读 272评论 3 2
  • 作者:清风悲秋我的现在和将来会病得不轻我的现在和将来会无药可救我的现在和将来没有人能偷走我深爱罗布泊死亡之海楼兰城...
    清风悲秋阅读 310评论 0 1
  • 不知道自己不知道的知识算是认知盲区了吧。之前总觉得面对高深的问题,比如关于生命的,关于宇宙的问题会存在我们不知道自...
    景景相依阅读 256评论 0 0