UDP通信——使用python通过UDP通信来发送和解析数据

UDP通信——使用python通过UDP通信来发送和解析数据

经常我们要发送的信息是结构化的数据,此时发送和接收数据结构就是一个很基本的工作,怎样来实现呢?
发送和接收数据结构我们要用到 python 的 struct 模块,该模块可以用 struct来处理c语言中的结构体。

首先来看下struct中支持的数据类型

Format C Type Python 字节数
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsinged int integer or long 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long

struct模块中最重要的三个函数是pack(), unpack(), calcsize()

pack(fmt, v1, v2, …) 按照给定的格式(fmt),把数据封装成字符串(实际上是类似于c结构体的字节流)

unpack(fmt, string) 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple(元组)

calcsize(fmt) 计算给定的格式(fmt)占用多少字节的内存

这里需要注意的是字节对齐的情况,字节对齐,简单来讲就是说比如一个 char 类型字符本来占1个字节,但是在结构体中,根据前后数据类型的不同,为了计算机读取内存的方便,会按照一定的规则给该 char 类型数据分配不只1个字节,可能是2个,那多出来的字节会导致我们按照各个数据类型长度算出来的与实际的不一样,我们可以写一段验证代码(下面是一段C++代码,因为用python来写的话还要用到一个库,下面会说到):

#include <stdio.h>

struct A
{
   
    double num1;
    double num2;
    bool num3;
};
#pragma pack(push,1)
struct B
{
   
    double num1;
    double num2;
    bool num3;
};
#pragma pack(pop)
int main()
{
   
    printf("length of A: %d\nlength of B: %d\n", sizeof(A), sizeof(B));
    return 0;
}

结果是:

length of A: 24
length of B: 17

1个double类型数据8个字节,1个bool类型数据1个字节,应该是17个字节,但是A的长度确实24个字节,相当于是3个double的长度,这就是字节对齐。而B的定义前后都加了一句话,

#pragma pack(push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐
#pragma pack(pop)          作用:恢复对齐状态

加上这两句话,就使得结构体的内存是连续的。
下面就可以用unpack()来进行数据解析了,要注意的是:字节对齐也有不同的规则,比如大端对齐、小端对齐等,所以需要struct用格式中的第一个字符来改变对齐方式。如下:

character byte order size aligenment
@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network(= big-endian) standard none

用法就是在unpack(fmt, string)中的 fmt 加上符号,比如 ’<2i3d’表示将数据解析为小端对齐方式的2个int类型和3个double类型。

一、使用unpack()方式解析数据

发送端是c++代码,接收端是python。

发送端

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值