Python内置进制转换函数(实现16进制和ASCII转换)

摘要:
在wireshark数据包捕获过程中,您会发现底部窗口中消息内容的左侧是十六进制数字,右侧是每两个十六进制转换的ASCII字符。这里,Python代码用于实现十六进制和ASCII转换方法。Hex()将整数对象转换为十六进制字符串˃˃Hex'0x10'˃˃Hex'0x12'˃˃Hex'0x20'˃˃oct()将一个整数对象转换成八进制字符串˃˃oct'o10'˃˃oct'0o246'˃˃bin()将整型对象转换成二进制字符串˃˃bin'b1010'˃˃bin'b111111'˃˃chr()将[0255]之间的整数转换成相应的ASCII字符˃˃chr'a'˃˃chr'C'˃˃chr'Z'˃˃˃chr'a'˃˃ord()将ASCII字符转换成ASCII字符对应的整数˃˃ord('A')65˃˃ord('z')122˃˃编写ASCII和十六进制转换器。我们知道hex()可以将十进制整数转换为十六进制数。

在进行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)

免责声明:文章转载自《Python内置进制转换函数(实现16进制和ASCII转换)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用GAN进行异常检测——可以进行网络流量的自学习哇,哥哥,人家是半监督,无监督的话,还是要VAE,SAE。手把手教你进行Pycharm活动模板配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows 安装使用jupyter及 基础配置

jupyter 是什么Jupyter Notebooks 是一个交互式笔记本,支持运行 40 多种编程语言,它的本质是一个 开源的 Web 应用程序,我们可以将其用于创建和共享代码与文档,他可以支持实时代码,数学方程,可视化和 markdown。Jupyter Notebooks提供了一个环境,让你可以无需离开这个环境,就可以在其中编写你的代码、运行代码、...

Python高级语法之:一篇文章了解yield与Generator生成器

Python高级语法中,由一个yield关键词生成的generator生成器,是精髓中的精髓。它虽然比装饰器、魔法方法更难懂,但是它强大到我们难以想象的地步:小到简单的for loop循环,大到代替多线程做服务器的高并发处理,都可以基于yield来实现。 理解yield:代替return的yield 简单来说,yield是代替return的另一种方案:...

在Ubuntu中创建一个简单的DJango项目

一:创建及运行虚拟环境 步骤说明 1. 使用命令行在Ubuntu系统下创建一个虚拟环境如创建一个叫py3的虚拟环境 irtualenv py3 2.进入创建好的虚拟环境 workon py3 3.在虚拟环境中安装Django, 代码说明 mkvirtualenv 创建虚拟环境 rmvirtualenv 删除虚拟环境 virtual 虚拟机...

Python multiprocessing使用详解

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiproc...

利用thrift在c++、java和python之间相互调用

转自:http://blog.csdn.net/andy_yf/article/details/7487384 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点;代码侵入较强是其弱点。 下面记录以C++做服务器,C++,java和python做客户端的示例,这个和本人现在工作环境吻合,使用多线程长连接的socket来建立高效分布式系统的跨语...

[转]SQLserver字符串分割函数

一、按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。 CREATE functionGet_StrArrayLength ( @str varchar(1024), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as b...