ver*_*tar 5 python struct crc pack nrpe
我有以下结构,来自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;
Run Code Online (Sandbox Code Playgroud)
我想将这种数据格式从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(....)
Run Code Online (Sandbox Code Playgroud)
守护程序正在接收以下值: 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结构文档:
要处理与平台无关的数据格式或省略隐式填充字节,请使用标准大小和对齐方式而不是本机大小和对齐方式:有关详细信息,请参阅字节顺序、大小和对齐方式。
使用 '!' 作为第一个格式字符,使打包结构与平台无关。它强制使用大端、标准类型大小,并且没有填充字节。那么 CRC 应该是一致的。
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |