python结构计算书_在Python中计算结构的CRC

I have the following struct, from the NRPE daemon code in C:

typedef struct packet_struct {

int16_t packet_version;

int16_t packet_type;

uint32_t crc32_value;

int16_t result_code;

char buffer[1024];

} packet;

I want to send this data format to the C daemon from Python. The CRC is calculated when crc32_value is 0, then it is put into the struct. My Python code to do this is as follows:

cmd = '_NRPE_CHECK'

pkt = struct.pack('hhIh1024s', 2, 1, 0, 0, cmd)

# pkt has length of 1034, as it should

checksum = zlib.crc32(pkt) & 0xFFFFFFFF

pkt = struct.pack('hhIh1024s', 2, 1, checksum, 0, cmd)

socket.send(....)

The daemon is receiving these values: version=2 type=1 crc=FE4BBC49 result=0

But it is calculating crc=3731C3FD

The actual C code to compute the CRC is:

and it is called via:

calculate_crc32((char *)packet, sizeof(packet));

When I ported those two functions to Python, I get the same as what zlib.crc32 returns.

Is my struct.pack call correct? Why is my CRC computation differing from the server's?

解决方案To handle platform-independent data formats or omit implicit pad

bytes, use standard size and alignment instead of native size and

alignment: see Byte Order, Size, and Alignment for details.

Use '!' as the first format character to make the packed structure platform-independent. It forces big-endian, standard type sizes, and no pad bytes. Then the CRCs should be consistent.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值