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デーモンに送信したいと思います。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

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計算がサーバーの計算と異なるのはなぜですか?

4

1 に答える 1

2

Python 構造体のドキュメントから:

プラットフォームに依存しないデータ形式を処理したり、暗黙的なパッド バイトを省略したりするには、ネイティブのサイズと配置ではなく、標準のサイズと配置を使用します。詳細については、バイト オーダー、サイズ、および配置を参照してください。

使用する '!' パック構造をプラットフォームに依存しないようにするための最初のフォーマット文字として。ビッグ エンディアン、標準型サイズ、パッド バイトなしを強制します。その場合、CRC は一貫している必要があります。

于 2012-08-17T04:03:12.107 に答える