Python3 常见的数据类型转换

发布于 2024-02-28 06:49:13 字数 4248 浏览 21 评论 0

以下代码均在 python3.6 下验证通过;因工作需要,使用 scapy 解析和构造网络数据包时,需要对解包后得到的字节流数据进行处理,同时需要处理数据转换,以下作为一个记录总结。

一、进制转换

# 10 进制转换成 16 进制
>>> hex(16)
'0x10'
>>> hex(11)
'0xa'
# 10 进制转换成 8 进制
>>> oct(8)
'0o10'
# 10 进制转换成 2 进制
>>> bin(4)
'0b100'

二、字符串与整数

字符转整数

10 进制整数与字符串

# 转换成 10 进制整数,默认参数为 10
>>> int('12')
12
>>> int('20',base=10)

16 进制整数与字符串

# 字符串转换成 16 进制整数
>>> int('12',16)
18
>>> int('10',16)
16
>>> int('0x11',16)
17
>>> int('0x2a',16)
42

8 进制整数与字符串

>>> int('10',8)
8
>>> int('012',8)
8

2 进制整数与字符串

# 字符串转成 2 进制整数
>>> int('11',2)
3
>>> int('111',2)
7

字符串也可转换成任意进制整数,但要注意字符串中的数字不能超出进制数。

# 如下字符串 35 转换为 4 进制的整数,将会报错。因为字符串中的 5 比 4 大。
>>> int('35',4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 4: '35'
>>> int('13',4)
7

整数转字符

利用以下两个方法可实现 ASCII 值与字符的相互转换。更多字符与值对应关系可以去查 ASCII 码表。

# ASCII 码 10 进制值为 65 的字符是'A'
>>> chr(65)
'A'
# 'a'的 ASCII 码 10 进制值为 97
>>> ord('a')
# 换行符 ASCII 码值
>>> ord('\n')
10

应用实例

mac 地址转整数。

a = 'FF:FF:FF:FF:FF:FF'.split(:)
for i in a:
int(i,16)

三、bytes 数据

创建 bytes 数据

python3 中,字符串与 bytes 类型是两种不同类型的数据。字符串以字符为单位进行处理,bytes 类型以字节为单位进行处理。

# 创建一个空的 bytes
>>> b = b''
>>> b = bytes()
# 指定 bytes 类型的数据
>>> b = b'hello'
b'hello'
# 利用 bytes 方法将字符串转换成 bytes 数据
>>> b = bytes('test',encoding='utf-8')
b'test'
>>> 'test'.encode()
b'test'

byte 字节和 string 转换

# 字符串编码成 bytes 字节流
>>> msg = '我要成为 code 的魔法师'
>>> msg.encode()
b'\xe6\x88\x91\xe8\xa6\x81\xe6\x88\x90\xe4\xb8\xbacode\xe7\x9a\x84\xe9\xad\x94\xe6\xb3\x95\xe5\xb8\x88'
# bytes 字节通过 decode 解码为 string 格式
>>> msg_bytes = msg.encode()
>>> msg_bytes.decode()
'我要成为 code 的魔法师'

将 bytes 数据转换成 string

>>> msg_b = b'\xe9\xad\x94\xe6\xb3\x95\xe5\xb8\x88'
# 方法一
>>> string(msg_b,'utf-8')
'魔法师'
# 方法二,参数默认 utf-8,第二参数 strict
>>> msg_b.decode()
'魔法师'
# 方法三,忽略非法字符
>>> msg_b1 = b'\xe9\xad\x94\xe6\xb3\x95\xe5\xb8\x88\x90'
>>> msg_b1.decode('utf-8','ignore')
'魔法师'
# 方法四,用?取代非法字符
>>> msg_b1.decode('utf-8','replace')
'魔法师�'

操作 bytes 数据

与操作字符串数据类似,可对 bytes 数据进行分片,replace 方法。

>>> msg_b = b'\xe9\xad\x94\xe6\xb3\x95\xe5\xb8\x88'
>>> msg_b[2:]
b'\x94\xe6\xb3\x95\xe5\xb8\x88'
>>> msg_b[-2:]
b'\xb8\x88'
>>> msg_b.replace(b'\xb8\x88',b'\xb3\xb95')
b'\xe9\xad\x94\xe6\xb3\x95\xe5\xb3\xb95'

四、应用实例

实例一

将 list 中的字符串转成 bytes 类型数据,如’FF’转换成’\xff’。参考 stackoverflow 上的回答。

# 方法一,本方法比方法二处理速度更快
import binascii
data = ['FF','FF','FF','FF']
bytestring = binascii.unhexlify(''.join(data))
# 以上代码 bytestring 结果如下
b'\xff\xff\xff\xff'
# 方法二
data = ['FF','FF','FF','FF']
bytesstring = bytes(int(x,16) for x in data)
# 以上代码 bytestring 结果如下
b'\xff\xff\xff\xff'

实例二

# 将 ip 地址转换成数据报文中 bytes 数据
# ip='192.168.0.120'
import binascii
def ip2bytes(ip):
b = []
ip_num_list = ip.split('.')
for num in ip_num_list:
b.append(hex(int(num))).replace('0x','')
for i in range(len(b)):
if len(b[i])<2:
b[i] = '0' + b[i]
return binascii.unhexlify(''.join(b))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

寒尘

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文