我有以下结构体,来自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守护进程发送这种数据格式。当crc32_value
为0
时,计算CRC并将其放入结构体中。我用以下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计算结果与服务器不同?