我有以下的结构,从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_value
是0
,那么它放入结构。 我的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计算从服务器的不同?