在Python计算结构的CRC(compute CRC of struct in Python)

2019-09-21 07:34发布

我有以下的结构,从C中的NRPE守护进程的代码:

typedef struct packet_struct {
  int16_t packet_version;
  int16_t packet_type;
  uint32_t crc32_value;
  int16_t result_code;
  char buffer[1024];
} packet;

我想这个数据格式发送到在Python的C守护进程。 当CRC计算crc32_value0 ,那么它放入结构。 我的Python代码要做到这一点,如下所示:

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(....)

守护进程接收这些值: version=2 type=1 crc=FE4BBC49 result=0

但它计算crc=3731C3FD

实际的C代码来计算CRC是:

https://github.com/KristianLyng/nrpe/blob/master/src/utils.c

它是通过调用:

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

当我移植这两个函数到Python,我得到一样东西zlib.crc32回报。

是我struct.pack通话两不误? 为什么我的CRC计算从服务器的不同?

Answer 1:

从Python的结构文档 :

为了处理独立于平台的数据格式或省略隐含的填充字节,使用标准尺寸和对齐,而不是本机的大小和排列:见字节顺序,大小和对齐的详细信息。

采用 '!' 作为第一个格式字符,使包装结构与平台无关。 它迫使大端,标准型尺寸,并没有填充字节。 然后两个CRC应该是一致的。



文章来源: compute CRC of struct in Python