python 和 c 字节对齐的用法

文章讨论了在上位机Python和下位机C语言之间通过结构体传递参数时,如何处理字节对齐的问题。Python使用LittleEndianStructure定义结构体,而C语言通过#pragmapack(1)来确保字节对齐,以此避免数据错误。如果不进行字节对齐,数据可能会出现缺失或移位。正确的做法是使上下位机的结构体布局保持一致。
摘要由CSDN通过智能技术生成

问题描述:

上位机传递参数到下位机中,参数类型为结构体,为了保证准确传递,c语言和python都有自己的方式来保证传递正确。

上位机python代码:

class HT_TAL_TBS_CMP_TypeDef(LittleEndianStructure):
	_pack_  = 1
	_field_ = [
		('c', c_int16),
		('lcmp', c_int16),
		('hcmp', c_int16),
		('a', c_int16),
		('b', c_int16)
	]

class HT_TAL_TBS_CONFIG_Typedef(LittleEndianStructure):
	_pack_ = 1
	_field_ = [
		('channel_en', HT_TAL_TBS_EN_Typedef),
		('ie', HT_TAL_TBS_EN_Typedef),
		('clk', c_uint8),
		('filter', c_uint8),
		('TBSPRD', HT_TAL_TBSPRD_TypeDef),
		('OSRSEL', c_uint8),
		('cmp', HT_TAL_TBS_CMP_TypeDef)
	]
# 传递的数据:
'cmp': {
	'c': 0xabcd,
	'低阈值': 0x54B2,
	‘高阈值': 0x13f6,
	’a': 0x1234,
	'b': 0x5678
}

下位机keil工程c代码:

	#pragma pack(1) 
	typedef struct{
		int16_t c;
		int16_t lcmp;
		int16_t hcmp;
		int16_t a;
		int16_t b;
	}TBS_CMP_T;
	typedef struct{
		TBS_EN_T channel_en;
		TBS_EN_T ie;
		uint8_t clk;
		uint8_t filter;
		TBSPRD_T TBSPRD;
		uint8_t OSRSEL;
		TBS_CMP_T cmp;
	} TBS_CONFIG_T;

	#pragma pack()

不加#pragma pack 结果,上位机字节对齐了但下位机没有,会出现数据缺失、移位的错误,此时下位机收到的数据如下:
在这里插入图片描述

加上后收到的数据和要传递的数据保持一致了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值