5

我有以下结构,来自 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在is时计算 CRC 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

计算 CRC 的实际 C 代码是:

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

它通过以下方式调用:

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

当我将这两个函数移植到 Python 时,我得到的结果与zlib.crc32返回的相同。

我的struct.pack电话正确吗?为什么我的 CRC 计算与服务器的不同?

4

1 回答 1

2

Python 结构文档

要处理与平台无关的数据格式或省略隐式填充字节,请使用标准大小和对齐方式而不是本机大小和对齐方式:有关详细信息,请参阅字节顺序、大小和对齐方式。

采用 '!' 作为使打包结构与平台无关的第一个格式字符。它强制大端、标准类型大小,并且没有填充字节。那么CRC应该是一致的。

于 2012-08-17T04:03:12.107 回答