Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了

您所在的位置:网站首页 16进制二进制转换 Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了

Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了

2024-07-14 09:50| 来源: 网络整理| 查看: 265

文章目录 前言数据类型转化int -> str使用 str() 函数使用 format() 函数使用 hex() 转换成16进制形式使用 bin() 转换成2进制形式 str -> int使用 int() 进行各进制数字转换 什么是bytesint -> bytes使用 to_bytes() 转换成定长bytes使用 bytes() 函数把int数组转成bytes使用 struct.pack() 函数把数字转化成bytes bytes -> int使用 from_bytes() 把 bytes 转化成int使用 struct.unpack() 把 bytes 转化成int str 和 bytes使用 encode() 函数完成 str -> bytes使用 decode() 函数完成 bytes -> str 假如使用了 str() 函数 转化表格总结

前言

数据类型转换是个很基础的操作,很多语言中都要做这些转换,例如前一段时间刚刚总结了《C/C++中string和int相互转换的常用方法》,python 自从分离出 python3 版本之后,str 和 bytes 两个类型弄蒙了一大票人,在这两种类型的转换上我可是花了不少时间,记住一点,别随随便便使用 str() 函数,很多数据使用 str() 变成字符串之后再想恢复可就难了。

本文所有示例均在 Python 3.7.5 上测试,Python2 已经被我抛弃了,我来试着把常见的转换都放到一起,把踩过的坑拿来开心一下,如果有些常用的类型转换这里没有的话,也欢迎小伙伴们提出来,我将持续补充,好了,可以开始了。

数据类型转化

数字中除了整数,还有浮点数、复数等,但是 int 是最常见的类型,所有转换中的数字只涉及 int 数字类型。

int -> str 使用 str() 函数 num = 10 val = str(10) print(type(val), val) # 10 使用 format() 函数 num = 10 val = '{0}'.format(num) print(type(val), val) # 10 使用 hex() 转换成16进制形式 num = 10 val = hex(num) print(type(val), val) # 0xa 使用 bin() 转换成2进制形式 num = 10 val = bin(num).replace('0b','') print(type(val), val) # 1010 str -> int

这个转换比较专一,只使用 int() 函数就可以了,这个函数实际上有两个参数,第二个参数表示进制,默认是10进制,你可以改成2进制或者16进制,甚至是3进制、5进制等等

使用 int() 进行各进制数字转换 val = int('10') print(type(val), val) val = int('0xa', 16) print(type(val), val) val = int('a', 16) print(type(val), val) val = int('0b1010', 2) print(type(val), val) val = int('1010', 2) print(type(val), val) val = int('101', 3) print(type(val), val) val = int('60', 5) print(type(val), val) # 结果均为 10

使用 int() 函数的时候要主要注意一点,如果提供的字符串不能转换成指定进制的数字,那么会报异常,就像下面这样,所以在使用这个函数的时候最好放到 try 语句中。

val = int('128', 2) ''' Traceback (most recent call last): File "D:\python\convert\convert.py", line 41, in val = int('128', 2) ValueError: invalid literal for int() with base 2: '128' [Finished in 0.1s with exit code 1] ''' 什么是bytes

在列举 bytes 相关的转化前,我们来先认识一下这个类型,在 Python3 中 int、str、bytes 类型的变量实际上都是一个 “类” 的对象,而 bytes 相比 str 而言更接近底层数据,也更接近存储的形式,它其实是一个字节的数组,类似于 C 语言中的 char [],每个字节是一个范围在 0-255 的数字。

bytes 其实就是这样一连串的数字,计算机世界所有的信息都可以用这样一串数字表示,一幅画,一首歌,一部电影等等,如果对编码感兴趣可以看看这篇《简单聊聊01世界中编码和解码这对磨人的小妖儿》,现在清楚bytes是什么了,我们可以看看和它相关的转化了。

int -> bytes 使用 to_bytes() 转换成定长bytes num = 4665 val = num.to_bytes(length=4, byteorder='little', signed=False) print(type(val), val) # b'9\x12\x00\x00'

这段代码就是把数字 4665 转化成定长的4个字节,字节序为小端,我们来简单看一下是怎么转换的:

上面我们提到 bytes 类型一串 0-255 范围的数字,4665 肯定超出了这个范围,可以先转化成256进制,就变成了 ,也就是 4665 = 18 * 256 + 57,我们发现两个字节就能存储这个数字,一个18,一个57,要想组成4个字节的数组需要补充两个空位,也就是补充两个0,这时就涉及到一个排列顺序,是 [0,0,18,57] 还是 [57, 18, 0, 0] 呢,这就是函数参数中的字节序 byteorder,little 表示小端,big 表示大端,这里选择的小端 [57, 18, 0, 0] 的排列。

看到这里可能会迷糊,好像和结果不一样啊,其实这只是一个表示问题,57 的 ASCII 码对应这个字符 ‘9’,18 表示成16进制就是 ‘0x12’,这里写成 b’9\x12\x00\x00’ 只是便于识别而已,实际上内存存储的就是 [57, 18, 0, 0] 这一串数字对应的二进制编码 ‘00111001 00010010 00000000 00000000’。

使用 bytes() 函数把int数组转成bytes

参考上面的生成的数组,可以通过数组生成相同的结果

num_array = [57, 18, 0, 0] val = bytes(num_array) print(type(val), val) # b'9\x12\x00\x00' 使用 struct.pack() 函数把数字转化成bytes num = 4665 val = struct.pack("


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3