gpt4 book ai didi

python - 在 Python 中计算结构的 CRC

转载 作者:太空狗 更新时间:2023-10-30 01:29:56 28 4
gpt4 key购买 nike

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

计算 CRC 的实际 C 代码是:

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

它是通过以下方式调用的:

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

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

我的 struct.pack 调用是否正确?为什么我的 CRC 计算与服务器的不同?

最佳答案

来自Python struct documentation :

To handle platform-independent data formats or omit implicit pad bytes, use standard size and alignment instead of native size and alignment: see Byte Order, Size, and Alignment for details.

使用“!”作为使压缩结构平台无关的第一个格式字符。它强制 big-endian、标准类型大小和无填充字节。那么CRC应该是一致的。

关于python - 在 Python 中计算结构的 CRC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11998591/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com