Python教程--数据流的基本解析和转换

一、前言

数据是我们在编写代码过程中,尤其是通信过程中,是经常要使用到的,牵扯到数据的封装,解析,转换,这一张我们为大家介绍基本的数据操作

二、数据封装

1、字符串编码

一般我们发送字符串之前,要对字符串进行编码,形成字节流,使用encode方法,一般英文字符使用的都是utf-8编码

import socket

#  定义一个字符串
a = "Hello World"
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 打印编码前和编码后的类型
print(type(a))
print(type(a.encode('utf-8')))
#  发送字符串,使用encode进行utf-8编码
s.sendto(a.encode('utf-8'), ("192.138.3.44", 8889))

结果:	<class 'str'>
		<class 'bytes'>

可以看到,编码后数据类型由str变成了bytes,我们不管使用套接字还是串口等,发送数据都要使用bytes类型的数据

如果我们要发送中文,那么使用GBK编码即可

import socket

#  定义一个字符串
a = "你好 世界"
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#  发送字符串,使用encode进行utf-8编码
s.sendto(a.encode('GBK'), ("192.138.3.44", 8889))

1、数字编码

数字与字符串不同,我们一般是将整型数据转换为16进制发送,我们可以使用一个现成的函数to_bytes,他可以帮助我们直接把整型数据转换为16进制数据流

import socket

#  定义一个字符串
a = 5
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 将a转换为大端模式,长度为1字节的数据流
print(a.to_bytes(1, byteorder="big"))
# 将a转换为大端模式,长度为2字节的数据流
print(a.to_bytes(2, byteorder="big"))
# 将a转换为小端模式,长度为2字节的数据流
print(a.to_bytes(2, byteorder="little"))

#  发送字符串,使用encode进行utf-8编码
s.sendto(a.to_bytes(1, byteorder="big"), ("192.138.3.44", 8889))

结果:	b'\x05'
		b'\x00\x05'
		b'\x05\x00'

这里有一个大端小端的概念,大端就是我们常见的模式,按照顺序即可,小端则是将高低8位进行颠倒,比如上面的例子,数字5,长度为2字节的16进制数据流,大端应该是0x00 0x05,这是符合我们阅读习惯的,而小端则是0x05 0x00,看到了么,是把高低进行了转换。如果是多个字节呢,很简单,比如数字1000,我们转换为长度为4个字节的16进制数据流,大端是0x00 0x00 0x03 0xe8,高低换位,则小端是0xe8 0x03 0x00 0x00

3、binascii编码

binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法

3.1 a2b_hex

将16进制转换为ASCII码

import binascii

# a2b_hex需要的参数为要转换的16进制字符串
print(binascii.a2b_hex("48656c6c6f20576f726c6421"))

结果:	b'Hello World!'

3.2 b2a_hex

与a2b_hex相反,是将ASCII码转换为16进制的方法

import binascii

# b2a_hex需要的参数为要转换的ASCII码的字节流,注意‘’前面多一个b,代表当前数据为字节流
print(binascii.b2a_hex(b"Hello World"))

结果:	b'48656c6c6f20576f726c64'

4、hex方法

hex方法是直接将10进制转为16进制字符串的方法

# 显示12的16进制
print(hex(12))
# 显示1000的16进制
print(hex(1000))

结果:	0xc
		0x3e8

三、数据解析

有封装,必然有解析,其实就是一个相反的过程

1、字符串解码

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("192.168.3.24", 8888))
data, addr = s.recvfrom(1024)
# 字符串解码使用decode方法,若发送的编码为utf-8,那我们解码也使用utf-8;若发送为GBK,那么相对应的解码也为GBK
print(data.decode('utf-8'))

2、数字解码

由16进制字节流转换为普通的十进制,我们使用int.from_bytes方法

a = b'\x00\x05'

# 按照小端格式输出
print(int.from_bytes(a, byteorder="little"))
# 按照大端格式输出
print(int.from_bytes(a, byteorder="big"))

结果:	1280
		5

要是获取16进制的的某一个字节,Python会自动输出10进制的数据,不需要经过任何的转换

a = b'\x00\x05'

print(a[0])
print(a[1])

结果:	0
		5

四、总结

这是数据的一个基本的转换和编码,通过这些,大家就可以在通信中畅通无阻了。当然,还有一种强大的库叫strcut,用它来封装和解析也是非常方便的,没有介绍的原因,只是本人单纯的不喜欢用,因为,哈哈哈,你懂得,处理指令太多了,不想记。当然大家想去了解的也可以自行去学习,这里就不做介绍啦。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值