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
CRCを計算するための実際のCコードは次のとおりです。
https://github.com/KristianLyng/nrpe/blob/master/src/utils.c
そしてそれは経由で呼び出されます:
calculate_crc32((char *)packet, sizeof(packet));
これらの2つの関数をPythonに移植すると、返されるものと同じものが得られzlib.crc32
ます。
私のstruct.pack
電話は正しいですか?CRC計算がサーバーの計算と異なるのはなぜですか?