目录
前言
进制之间的转换
字符串和数字之间的转换
单个字符和对应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 "", line 1, in
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 "", line 1, in
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 "", line 1, in
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 "", line 1, in
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 "", line 1, in
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'
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'))