目录

前言

进制之间的转换

字符串和数字之间的转换

单个字符和对应ascii转换


前言

    项目中用到了pyDES模块和hashlib模块,计算出来的结果和预期的总是不一致,后来不断的实验发现是传入数据类型不一致导致的,传入hex类型和bytes类型计算出来的完全不一致。以此做个总结顺便复习以下数字和字符串之间的转换。

进制之间的转换

bin( number ):接收的是数字,可以是二进制数、八进制数、十进制数和十六进制数,返回以0b开头的二进制字符串表示

>>> bin(0b111)
'0b111'
>>> bin(0o111)#0o表示八进制
'0b1001001'
>>> bin(0x111)
'0b100010001'
>>> bin(111)
'0b1101111'
>>> bin('111')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
>>>

 

oct(number):内置函数,接收一个数字,可以是二进制数、八进制数、十进制数和十六进制数,返回以0o开头的八进制字符串表示

>>> oct(0b111)
'0o7'
>>> oct(111)
'0o157'
>>> oct(0x111)
'0o421'
>>> oct(0o111)
'0o111'
>>> oct('111')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
>>>

hex(number ):

数字,可以是二进制数、八进制数、十进制数和十六进制数,返回以0x开头的十六进制字符串表示

>>> hex(0b111)
'0x7'
>>> hex(111)
'0x6f'
>>> hex(0o111)
'0x49'
>>> hex(0x111)
'0x111'
>>> hex('111')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
>>>

int()

类,构造函数如下:

 int(x=0) --> integer

 int(x, base=10) --> integer

函数作用:把一个数字或者字符转换为一个整数

参数说明

如果没有指定任何参数返回的是数字0;

如果输入的是浮点数返回的只有整数部分,相当于向下取整;

如果给定了参数base那么x必须是字符串或bytes或bytearray instance ;

base有效的取值是0,或2-36,默认值是10,代表x是十进制;base为0表示x按照字面意思进行解析

>>> int()
0
>>> int(12.98)	      #将浮点数向下取整
12
>>> int('0o10',base=0)  #0o代表八进制,此语句等价于int('0o10',base=8)
8
>>> int('10',base=0)    #默认为十进制,此语句等价于int('10',base=10)
10
>>> int('0b1010',base=0) #0b代表二进制,等价于int('0b1010',base=2)
10
>>> int('0x10',base=0)  #0o代表十六进制,等价于 int('0x10',base=16) 
16
>>> int('0b1010',base=2)  
10
>>> int(0x10,base=16)  #给定了参数base,x不是字符类型
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() can't convert non-string with explicit base
>>> int(0b10)    #直接将输入的二进制转换为十进制数
2
>>> int(0o10)   #直接将输入的八进制转换为十进制数
8
>>> int(0x10)   #直接将输入的十六进制转换为十进制数
16
>>> int(10)     #返回的数据和输入的一致
10
>>> int('15',base=16)  #表示将16进制的0x15转换成10进制数
21
>>> int('15',base=8)   #表示将8进制的0o15转换成10进制数
13
>>> int('15',base=10)  #表示将10进制的15转换成10进制数
15
>>> int('15',base=2)   #将2进制的0x15转换成10进制数,二进制只有0、1,所以会抛出ValueError异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '15'

 

字符串和数字之间的转换

需要注意的时,待转换的都是字符串,只是里面的值代表的是字符还是数字。将转换函数封装在模块中。

#encoding = utf-8
import re

def bin2str(text):
      '''将二进制转换为字符串'''
      if not isinstance(text,str):
            raise TypeError('input is not a str type')
      binstr = text.replace(' ','')#去掉空格
      #8个字符为一组分组
      bin_list = re.findall(r'.{8}',binstr)
      #由于正则得到的是字符串,所以将每组的值由由二进制转换为十进制,再转换为字符表示
      return ''.join(map(lambda x : chr(int(x,2)),bin_list))

def hex2str(text):
      '''十六进制转换为字符串'''
      if not isinstance(text,str):
            raise TypeError('input is not a str type')
      hexstr = text.replace(' ','')
      #2个字符为一组分组
      hex_list = re.findall(r'.{2}',hexstr)
      #由于正则得到的是字符串,所以将每组的值由16进制转换为十进制,再转换为字符表示
      return ''.join(map(lambda x : chr(int(x,16)),hex_list))

def ascii2str(text):
      '''将ascii码转换为字符串'''
      if not isinstance(text,str):
            raise TypeError('input is not a str type')
      asciistr = text.replace(' ','')
      #2个字符为一组分组
      ascii_list = re.findall(r'.{2}',asciistr)
      #由于正则得到的是字符串,所以将每组的值由16进制转换为十进制,再转换为字符表示
      return ''.join(map(lambda x : chr(int(x)),ascii_list))

def str2hex(text):
      '''将字符串转换为十六进制数'''
      if not isinstance(text,(str,bytes)):
            raise TypeError('input is not a str type')
      if isinstance(text,str):
            data = text.encode('utf8')
      else:
            data = text[:]
      return ''.join(map(lambda x : hex(x)[2:],data))
def char2float(s):
      '''把字符串'123.456'转换成浮点数123.456'''
        from functools import reduce
        integer,decimal = s.split('.')
        num_list = list(map(lambda n: reduce(lambda x,y : int(x)*10+int(y),n),s.split('.')))
        return num_list[0] + num_list[-1]/pow(10,len(num_list))
      
if __name__ == "__main__":
      import binascii
      s = '00101111011001100011011000110111001100110011001000110100001100010011000001100001011000010110010001100011001100000011001100110111011001100110001000110000011000110110001001100001011000010011000000110000011000110011011100110101001100110011000100110011001101110011001100101110011101000111100001110100'
      print(bin2str(s))

      s = b'666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D'.decode()
      print(hex2str(s))
      assert hex2str(s).encode() == binascii.a2b_hex(s) , 'assert error'

      s='4546454632453246464546324645464632464646324546464632464645454645324546464632464646324645464632'
      print(ascii2str(s))

      s = 'Please encrypt my data '.encode()
      assert str2hex(s).encode() == binascii.b2a_hex(s) , 'assert error'

单个字符和对应ascii转换

chr(i):返回一个数字i对应的unicode字符串,i的取值为 0 <= i <= 0x10ffff.

>>> chr(65)
'A'
>>> chr(3)
'\x03'
>>> chr(32)
' '
>>> chr(32999)
'胧'

ord():返回unicode字符对应的ascii码值,返回的是数字

>>> ord('a')
97
>>> ord('8')
56
>>> ord('*')
42
>>> ord('中')
20013
>>> type(ord('a'))
<class 'int'>