我是靠谱客的博主 自然仙人掌,最近开发中收集的这篇文章主要介绍python3:数字/字符串之间的转换前言进制之间的转换字符串和数字之间的转换单个字符和对应ascii转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

前言

进制之间的转换

字符串和数字之间的转换

单个字符和对应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'>

 

最后

以上就是自然仙人掌为你收集整理的python3:数字/字符串之间的转换前言进制之间的转换字符串和数字之间的转换单个字符和对应ascii转换的全部内容,希望文章能够帮你解决python3:数字/字符串之间的转换前言进制之间的转换字符串和数字之间的转换单个字符和对应ascii转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部