Python3 常见的数据类型转换
以下代码均在 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 技术交流群。
上一篇: python 判断变量是否存在的几种方法
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论