zoukankan      html  css  js  c++  java
  • Python内置进制转换函数(实现16进制和ASCII转换)

    在进行wireshark抓包时你会发现底端窗口报文内容左边是十六进制数字,右边是每两个十六进制转换的ASCII字符,这里使用Python代码实现一个十六进制和ASCII的转换方法。

    hex()

    转换一个整数对象为十六进制的字符串

    >>> hex(16)
    '0x10'
    >>> hex(18)
    '0x12'
    >>> hex(32)
    '0x20'
    >>> 
    

    oct()

    转换一个整数对象为八进制的字符串

    >>> oct(8)
    '0o10'
    >>> oct(166)
    '0o246'
    >>> 
    

    bin()

    转换一个整数对象为二进制字符串

    >>> bin(10)
    '0b1010'
    >>> bin(255)
    '0b11111111'
    >>> 
    

    chr()

    转换一个[0, 255]之间的整数为对应的ASCII字符

    >>> chr(65)
    'A'
    >>> chr(67)
    'C'
    >>> chr(90)
    'Z'
    >>> chr(97)
    'a'
    >>> 
    

    ord()

    将一个ASCII字符转换为对应整数

    >>> ord('A')
    65
    >>> ord('z')
    122
    >>>
    

    写一个ASCII和十六进制转换器

    上面我们知道hex()可以将一个10进制整数转换为16进制数。而16进制转换为10进制数可以用int('0x10', 16) 或者int('10', 16)

    16进制转10进制
    >>> int('10', 16)
    16
    >>> int('0x10', 16)
    16
    
    8进制转10进制
    >>> int('0o10', 8)
    8
    >>> int('10', 8)
    8
    
    2进制转10进制
    >>> int('0b1010', 2)
    10
    >>> int('1010', 2)
    10
    

    代码如下:

    class Converter(object):
        @staticmethod
        def to_ascii(h):
            list_s = []
            for i in range(0, len(h), 2):
                list_s.append(chr(int(h[i:i+2], 16)))
            return ''.join(list_s)
    
        @staticmethod
        def to_hex(s):
            list_h = []
            for c in s:
                list_h.append(str(hex(ord(c))[2:]))
            return ''.join(list_h)
    
    
    print(Converter.to_hex("Hello World!"))
    print(Converter.to_ascii("48656c6c6f20576f726c6421"))
    
    # 等宽为2的16进制字符串列表也可以如下表示
    import textwrap
    s = "48656c6c6f20576f726c6421"
    res = textwrap.fill(s, width=2)
    print(res.split())  #['48', '65', '6c', '6c', '6f', '20', '57', '6f', '72', '6c', '64', '21']
    

    生成随机4位数字+字母的验证码

    可以利用random模块加上chr函数实现随机验证码生成。

    import random
    
    
    def verfi_code(n):
        res_li = list()
        for i in range(n):
            char = random.choice([chr(random.randint(65, 90)), chr(
                random.randint(97, 122)), str(random.randint(0, 9))])
            res_li.append(char)
        return ''.join(res_li)
    
    print(verfi_code(6))
    

    其它进制转换操作

    把整数格式化为2位的16进制字符串,高位用零占位
    >>> '{:02x}'.format(9)
    >>> '09'
    
    把整数格式化为2位的16进制字符串,高位用空占位
    >>> '{:2x}'.format(9)
    >>> ' 9'
    
    把整数格式化为2位的16进制字符串
    >>> '{:x}'.format(9)
    >>> '9'
    
    把整数格式化为2位的8进制字符串,高位用空占位
    >>> '{:2o}'.format(9)
    >>> '11'
    
    把整数格式化为2位的8进制数字符串,高位用空占位
    >>> '{:2o}'.format(6)
    >>> ' 6'
    
    把整数格式化为2位的8进制字符串,高位用零占位
    >>> '{:02o}'.format(6)
    >>> '06'
    
    把整数格式化为8位的2进制字符串,高位用零占位
    >>> '{:08b}'.format(73)
    >>> '01001001'
    
    把整数格式化为2进制字符串
    >>> '{:b}'.format(73)
    >>> '1001001'
    
    把整数格式化为8位的2进制字符串,高位用空占位
    >>> '{:8b}'.format(73)
    >>> ' 1001001'
    

    程序猿(二进制)的浪漫

    哈哈听说过程序猿的浪漫么,下面将ASCII字符'I love you'转换为二进制,请将这些二进制发给你喜欢的人吧,看看who understands you

    def asi_to_bin(s):
        list_h = []
        for c in s:
            list_h.append('{:08b}'.format(ord(c)))	# 每一个都限制为8位二进制(0-255)字符串
        return ' '.join(list_h)
    
    print(asi_to_bin("I love you"))
    
    # 01001001001000000110110001101111011101100110010100100000011110010110111101110101
    # 01001001 00100000 01101100 01101111 01110110 01100101 00100000 01111001 01101111 01110101
    

    python实现IP地址转换为32位二进制

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    
    class IpAddrConverter(object):
    
        def __init__(self, ip_addr):
            self.ip_addr = ip_addr
    
        @staticmethod
        def _get_bin(target):
            if not target.isdigit():
                raise Exception('bad ip address')
            target = int(target)
            assert target < 256, 'bad ip address'
            res = ''
            temp = target
            for t in range(8):
                a, b = divmod(temp, 2)
                temp = a
                res += str(b)
                if temp == 0:
                    res += '0' * (7 - t)
                    break
            return res[::-1]
    
        def to_32_bin(self):
            temp_list = self.ip_addr.split('.')
            assert len(temp_list) == 4, 'bad ip address'
            return ''.join(list(map(self._get_bin, temp_list)))
    
    
    if __name__ == '__main__':
        ip = IpAddrConverter("192.168.25.68")
        print(ip.to_32_bin())
    

    python 判断两个ip地址是否属于同一子网

    """
    判断两个IP是否属于同一子网, 需要判断网络地址是否相同
    网络地址:IP地址的二进制与子网掩码的二进制地址逻辑“与”得到
    主机地址: IP地址的二进制与子网掩码的二进制取反地址逻辑“与”得到
    """
    
    
    class IpAddrConverter(object):
    
        def __init__(self, ip_addr, net_mask):
            self.ip_addr = ip_addr
            self.net_mask = net_mask
    
        @staticmethod
        def _get_bin(target):
            if not target.isdigit():
                raise Exception('bad ip address')
            target = int(target)
            assert target < 256, 'bad ip address'
            res = ''
            temp = target
            for t in range(8):
                a, b = divmod(temp, 2)
                temp = a
                res += str(b)
                if temp == 0:
                    res += '0' * (7 - t)
                    break
            return res[::-1]
    
        def _to_32_bin(self, ip_address):
            temp_list = ip_address.split('.')
            assert len(temp_list) == 4, 'bad ip address'
            return ''.join(list(map(self._get_bin, temp_list)))
    
        @property
        def ip_32_bin(self):
            return self._to_32_bin(self.ip_addr)
    
        @property
        def mask_32_bin(self):
            return self._to_32_bin(self.net_mask)
    
        @property
        def net_address(self):
            ip_list = self.ip_addr.split('.')
            mask_list = self.net_mask.split('.')
            and_result_list = list(map(lambda x: str(int(x[0]) & int(x[1])), list(zip(ip_list, mask_list))))
            return '.'.join(and_result_list)
    
        @property
        def host_address(self):
            ip_list = self.ip_addr.split('.')
            mask_list = self.net_mask.split('.')
            rever_mask = list(map(lambda x: abs(255 - int(x)), mask_list))
            and_result_list = list(map(lambda x: str(int(x[0]) & int(x[1])), list(zip(ip_list, rever_mask))))
            return '.'.join(and_result_list)
    
    
    if __name__ == '__main__':
        ip01 = IpAddrConverter("211.95.165.24", "255.255.254.0")
        ip02 = IpAddrConverter("211.95.164.78", "255.255.254.0")
        print(ip01.net_address == ip02.net_address)
  • 相关阅读:
    Codeforces 590 A:Median Smoothing
    HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
    POJ 1027:The Same Game 较(chao)为(ji)复(ma)杂(fan)的模拟
    【算法学习】 在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?
    【读书笔记】 spinlock, mutex and rwlock 的性能比较
    【读书笔记】 nginx 负载均衡测试
    【读书笔记】 多线程程序常见bug
    关注一下 hurd OS的开发
    【读书笔记】 分布式文件存储系统 MogileFS
    【读书笔记】 nginx + memcached 高速缓存
  • 原文地址:https://www.cnblogs.com/liao-lin/p/9882488.html
Copyright © 2011-2022 走看看