我有一个C结构。
typedef struct
{
double cycle_time;
double cycle_duty;
double state;
double servo_mode;
double motion_mode;
double jcond;
struct
{
uint16_t buff_sz;
uint16_t buff_fill;
uint16_t cmd_cntr;
uint16_t res;
} wpi;
double move_des_q[6];
double move_des_qd[6];
double move_des_x[6];
double move_des_xd[6];
double act_q[6];
double act_qd[6];
double act_x[6];
double act_xd[6];
double act_tq[6];
double frict_tq[6];
double ne_tq[6];
double act_force_e[6];
double act_force_0[6];
double des_trq[6];
double des_qd[6];
double temp_m[6];
double temp_e[6];
double arm_current;
double arm_voltage;
double psu_voltage;
struct
{
uint8_t dig_in_count;
uint8_t an_in_count;
uint8_t dig_in[8];
uint8_t an_in_curr_mode[4];
double an_in_value[4];
uint8_t dig_out_count; //number of bits
uint8_t an_out_count;
uint8_t dig_out[8];
uint8_t an_out_curr_mode[4];
double an_out_value[4];
} io;
struct
{
uint32_t jointState;
float joint_volt;
float joint_amp;
uint8_t joint_window;
float joint_des_iq;
float joint_des_vel;
} jointInfo[6];
} some_structure;
字符串
在运行计算代码后,我发现了C结构的大小(1136字节)(至少我希望它是正确的)。代码如下:
int main()
{
printf("Size of struct ABC: %lu\n", sizeof(some_structure));
}
型
但是,在检查python结构大小后,我发现了一些差异(pythonsize is1114 bytes)。下面是Python代码:
struct_string = "<6d4H105d14B4d14B4dL2fB2fL2fB2fL2fB2fL2fB2fL2fB2fL2fB2f"
struct_byte_size = struct.calcsize(struct_string)
print(struct_byte_size)
型
是什么导致了这种规模的变化?如何从socket接收数据并避免这种转换?在创建struct_string的时候可能出错了吗?
UPD:Here是struct-module rule-table和calcsize()的描述。
1条答案
按热度按时间7tofc5zh1#
差异是由于C编译器添加了用于对齐的填充字节。如果变量的地址是变量类型大小的倍数,则代码的效率会更高。当使用Python的
struct
模块时,除了原生(@)对齐(默认)之外,它不使用填充字节。例如,如果通过
cl /Wall test.c
启用了所有警告,则Microsoft编译器会指示填充:字符串
可以使用
#pragma pack
禁用此填充。示例如下:test.c
型
使用本机填充的输出:
型
#pragma pack
语句未注解的输出:型
从Python代码中删除
<
以使用本机填充,或者考虑填充:型
输出量:
型
解压缩结构返回一个187元组。很难计算出特定值的正确偏移。
考虑使用
ctypes
模块,在该模块中可以指定命名字段和嵌套结构,以便更自然地查找特定值。示例如下:型
输出(PACK=1):
型
输出(PACK=8):
型