Python与C++结构体交互,,需求:根据接口规范,


需求:根据接口规范,实现与服务端的数据交互

服务端结构体分包头、包体、包尾

包头C++结构体示例如下

技术分享
 1 typedef struct head 2 { 3     BYTE string1; 4     BYTE    string2;    //包类型 5     BYTE    string3;            //版本号,目前为0 6     char    string4[33];         7     int        string5;         8     int        string6;             9     unsigned int string7;    //包头校验和,以上所有字段的crc32校验和10     char    string8;11     char    string9;12 }protocol_head;
View Code

包体C++结构体示例如下

技术分享
1 typedef struct body2 {3     char    sessid[33];4     int        datalen;    5     BYTE    data[0];    6 };
View Code

包尾C++结构体示例如下

技术分享
1 // 包尾 - 粘包分割2 typedef struct tag_protocol_tail3 {4     BYTE tail[4]5 }protocol_tail;
View Code

根据包头结构体的要求,需要使用CRC32校验

技术分享
 1 unsigned int GetCRC32(const unsigned char *pbData, int nSize) 2 { 3     unsigned long Table[256]={0}; 4     unsigned long  ulPolynomial = 0xEDB88320; 5  6     unsigned long  dwCrc; 7     int i,j; 8     for(i = 0; i < 256; i++) 9     {10         dwCrc = i;11         for(j = 8; j > 0; j--)12         {13             if(dwCrc & 1)14                 dwCrc = (dwCrc >> 1) ^ ulPolynomial;15             else16                 dwCrc >>= 1;17         }18         Table[i] = dwCrc;19     }20 21     unsigned long dwCrc32 = 0xFFFFFFFF;22     int idx=0;23     while(nSize--)24     {25         dwCrc32 = ((dwCrc32) >> 8) ^ Table[(pbData[idx]) ^ ((dwCrc32) & 0x000000FF)];26         idx++;27     }28     return ~dw
View Code

python 实现内容

struct中支持的格式如下表:

Format

C Type

Python

字节数

x

pad byte

no value

1

c

char

string of length 1

1

b

signedchar

integer

1

B

unsignedchar

integer

1

?

_Bool

bool

1

h

short

integer

2

H

unsignedshort

integer

2

i

int

integer

4

I

unsignedint

integer or long

4

l

long

integer

4

L

unsignedlong

long

4

q

longlong

long

8

Q

unsignedlonglong

long

8

f

float

float

4

d

double

float

8

s

char[]

string

1

p

char[]

string

1

P

void*

long

举例C中常用:

int16=short --> h
uint32=unsigned int --> I

UInt64=unsignedlonglong --> Q
byte表示一个字节,对应C的unsigned char --> B

python中CRC32校验

技术分享
 1 def mycrc32(szString): 2     # 校验码 3     m_pdwCrc32Table = [0 for x in range(0, 256)] 4     dwPolynomial = 0xEDB88320 5     dwCrc = 0 6     for i in range(0, 255): 7         dwCrc = i 8         for j in [8, 7, 6, 5, 4, 3, 2, 1]: 9             if dwCrc & 1:10                 dwCrc = (dwCrc >> 1) ^ dwPolynomial11             else:12                 dwCrc >>= 113         m_pdwCrc32Table[i] = dwCrc14     dwCrc32 = 0xFFFFFFFFL15     for i in szString:16         b = ord(i)17         dwCrc32 = ((dwCrc32) >> 8) ^ m_pdwCrc32Table[(b) ^ ((dwCrc32) & 0x000000FF)]18     dwCrc32 = dwCrc32 ^ 0xFFFFFFFFL19     return dwCrc32
View Code

C++和python关于CRC32代码传入参数如何理解?

根据上面C++代码内容,可以看到传入2位参数,它的第一位参数是整个包头+包体+包尾内容,第二位参数是整个包前多少位的长度需要校验

对于python代码,实际上只要传入需要校验的内容。

本文中需要传入的内容实际上是包头的的前6个字段,也就是包头的string1+string2+string3+string4+string5+string6

包头代码

技术分享
 1 # 包头, data为传入的包体,body_len是包体长度 2 def qzj_head(data, body_len): 3     string1 = 100 4     string2 = 1 5     string3 = 0 6     string4 = "6" 7     string5 = body_len 8     string6 = body_len 9 10     string1 = struct.pack(‘B‘, string1 )11     string2 = struct.pack(‘B‘, string2 )12     string3 = struct.pack(‘B‘, string3)13     string4 = struct.pack(‘33s‘, string4 )14     string5 = struct.pack(‘i‘, string5 )15     string6 = struct.pack(‘i‘, string6 )16 17     string7_struct = string1+string2+string3+string4+string5+string6  # 前面的6个字段内容18     string7_crc32 = des_key.mycrc32(headcrc_str)  # crc32校验19     string7 = struct.pack(‘I‘, string7_crc32)20     string8 = 021     string9 = 022     string8 = struct.pack(‘B‘, string8)23     string9 = struct.pack(‘B‘, string9)24 25     request_head = string1+string2+string3+string4+string5+string6+string7+string8+string9+data26     return request_head
View Code

包尾代码

技术分享
 1 # 包尾,data是传入的包头+包体 2 def qzj_tail(data): 3     tail1 = ‘\0‘ 4     tail2 = ‘\0‘ 5     tail3 = ‘\r‘ 6     tail4 = ‘\n‘ 7     tail1 = struct.pack(‘s‘, tail1) 8     tail2 = struct.pack(‘s‘, tail2) 9     tail3 = struct.pack(‘s‘, tail3)10     tail4 = struct.pack(‘s‘, tail4)11     request_tail = data+tail1+tail2+tail3+tail412     return request_tail
View Code

包体代码

技术分享
 1 # 包体, data是要发送的json数据 2 def body_100(data): 3     string1 = ‘‘ 4     string2 = len(data) 5     string3 = data 6  7     string1 = struct.pack(‘33s‘, string1) 8     string2 = struct.pack(‘i‘, string2) 9     string3 = struct.pack(‘%ds‘ % datalen_num, string3)10     request_body = string1+string2+string311     return request_body, len(request_body)
View Code

Python与C++结构体交互

相关内容

    暂无相关文章

评论关闭