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

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

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

 typedef struct head
{
BYTE string1;
BYTE string2; //包类型
BYTE string3; //版本号,目前为0
char string4[];
int string5;
int string6;
unsigned int string7; //包头校验和,以上所有字段的crc32校验和
char string8;
char string9;
}protocol_head;

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

 typedef struct body
{
char sessid[];
int datalen;
BYTE data[];
};

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

 // 包尾 - 粘包分割
typedef struct tag_protocol_tail
{
BYTE tail[]
}protocol_tail;

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

 unsigned int GetCRC32(const unsigned char *pbData, int nSize)
{
unsigned long Table[]={};
unsigned long ulPolynomial = 0xEDB88320; unsigned long dwCrc;
int i,j;
for(i = ; i < ; i++)
{
dwCrc = i;
for(j = ; j > ; j--)
{
if(dwCrc & )
dwCrc = (dwCrc >> ) ^ ulPolynomial;
else
dwCrc >>= ;
}
Table[i] = dwCrc;
} unsigned long dwCrc32 = 0xFFFFFFFF;
int idx=;
while(nSize--)
{
dwCrc32 = ((dwCrc32) >> ) ^ Table[(pbData[idx]) ^ ((dwCrc32) & 0x000000FF)];
idx++;
}
return ~dw

python 实现内容

struct中支持的格式如下表:

Format

C Type

Python

字节数

x

pad byte

no value

1

c

char

string of length 1

1

b

signed char

integer

1

B

unsigned char

integer

1

?

_Bool

bool

1

h

short

integer

2

H

unsigned short

integer

2

i

int

integer

4

I

unsigned int

integer or long

4

l

long

integer

4

L

unsigned long

long

4

q

long long

long

8

Q

unsigned long long

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=unsigned long long --> Q
byte表示一个字节,对应C的unsigned char  --> B

python中CRC32校验

 def mycrc32(szString):
# 校验码
m_pdwCrc32Table = [0 for x in range(0, 256)]
dwPolynomial = 0xEDB88320
dwCrc = 0
for i in range(0, 255):
dwCrc = i
for j in [8, 7, 6, 5, 4, 3, 2, 1]:
if dwCrc & 1:
dwCrc = (dwCrc >> 1) ^ dwPolynomial
else:
dwCrc >>= 1
m_pdwCrc32Table[i] = dwCrc
dwCrc32 = 0xFFFFFFFFL
for i in szString:
b = ord(i)
dwCrc32 = ((dwCrc32) >> 8) ^ m_pdwCrc32Table[(b) ^ ((dwCrc32) & 0x000000FF)]
dwCrc32 = dwCrc32 ^ 0xFFFFFFFFL
return dwCrc32

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

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

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

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

包头代码

 # 包头, data为传入的包体,body_len是包体长度
def qzj_head(data, body_len):
string1 = 100
string2 = 1
string3 = 0
string4 = ""
string5 = body_len
string6 = body_len string1 = struct.pack('B', string1 )
string2 = struct.pack('B', string2 )
string3 = struct.pack('B', string3)
string4 = struct.pack('33s', string4 )
string5 = struct.pack('i', string5 )
string6 = struct.pack('i', string6 ) string7_struct = string1+string2+string3+string4+string5+string6 # 前面的6个字段内容
string7_crc32 = des_key.mycrc32(headcrc_str) # crc32校验
string7 = struct.pack('I', string7_crc32)
string8 = 0
string9 = 0
string8 = struct.pack('B', string8)
string9 = struct.pack('B', string9) request_head = string1+string2+string3+string4+string5+string6+string7+string8+string9+data
return request_head

包尾代码

 # 包尾,data是传入的包头+包体
def qzj_tail(data):
tail1 = '\0'
tail2 = '\0'
tail3 = '\r'
tail4 = '\n'
tail1 = struct.pack('s', tail1)
tail2 = struct.pack('s', tail2)
tail3 = struct.pack('s', tail3)
tail4 = struct.pack('s', tail4)
request_tail = data+tail1+tail2+tail3+tail4
return request_tail

包体代码

 # 包体, data是要发送的json数据
def body_100(data):
string1 = ''
string2 = len(data)
string3 = data string1 = struct.pack('33s', string1)
string2 = struct.pack('i', string2)
string3 = struct.pack('%ds' % datalen_num, string3)
request_body = string1+string2+string3
return request_body, len(request_body)

Python与C++结构体交互的更多相关文章

  1. python与C结构体之间二进制数据转换

    python与C结构体之间数据转换 前言 在实际应用中,可能会遇到直接和C进行二进制字节流协议通信,这时要把数据解包成python数据,如果可能,最好与C定义的结构体完全对应上. python中有2种 ...

  2. c++调用python系列(1): 结构体作为入参及返回结构体

    最近在打算用python作测试用例以便对游戏服务器进行功能测试以及压力测试; 因为服务器是用c++写的,采用的TCP协议,当前的架构是打算用python构造结构体,传送给c++层进行socket发送给 ...

  3. ctypes 操作 python 与 c++ dll 互传结构体指针

    CMakeLists.txt # project(工程名) project(blog-3123958139-1) # add_library(链接库名称 SHARED 链接库代码) add_libra ...

  4. python 传递结构体指针到 c++ dll

    CMakeLists.txt # project(工程名) project(xxx) # add_library(链接库名称 SHARED 链接库代码) add_library(xxx SHARED ...

  5. slots - Python的结构体 转

          上个月看了篇文章 “SAVING 9 GB OF RAM WITH PYTHON’S __SLOTS__”,原来Python也有类似结构体的东东.拖了一个月才写这篇,是因为太久没看pyth ...

  6. python如何将指定路径下的某类型文件,返回一个树形结构体,让前端显示为树形的目录结构

    最近遇到一个问题就是某个linux的目录下有各种文件现在的要求是只需要返回.kml格式的文件,并根据前端要求返回如下结构体即:[{'children': [{'children': [{'title' ...

  7. 『Python CoolBook』C扩展库_其四_结构体操作与Capsule

    点击进入项目 一.Python生成C语言结构体 C语言中的结构体传给Python时会被封装为胶囊(Capsule), 我们想要一个如下结构体进行运算,则需要Python传入x.y两个浮点数, type ...

  8. python 实现结构体

    # python 使用类创建结构体 class Myclass(object): class Struct(object): def __init__(self, name, age, job): s ...

  9. Python 定义及使用结构体

    Python中没有专门定义结构体的方法,但可以使用class标记定义类来代替结构体,其成员可以在构造函数__init__中定义,具体方法如下. class seqNode: def __init__( ...

随机推荐

  1. SDRAM读写一字(上)

    SDRAM读写一字 系统设计 SDRAM指令 指令 常量名 CKE CSn RAS CASn WEn 备注 空操作 NOP 1 0 1 1 1   行激活 ACTIVE 1 0 0 1 1   读操作 ...

  2. bindService初步了解

    bindService的使用: 当需要调Service里面的方法时,可以用bindService() 首先定义一个类继承于Service,然后配置Manifest.xml文件 public class ...

  3. Windows去除快捷箭头

    美化桌面 bat代码: reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shel ...

  4. Java--剑指offer(10)

    46.每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一 ...

  5. SwipeRefreshLayout 首次打开出现加载图标

    最近要实现如何如图效果: 主要是在初始化,代码如下: , getResources().getDimensionPixelSize(typed_value.resourceId));    refre ...

  6. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  7. Shell脚本_备份/etc数据

    vim backup_etc.sh chmod 755 backup_etc.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  8. 【BZOJ 3150】新Nim游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3105 并不会QwQ 为什么贪心是正确的. 向小神请教了一个弱智问题(小神好神啊OTZ) 然后就写了一 ...

  9. Mysql-linux下密码修改,忘记密码修改,超级管理用户修改

    未忘记密码 方法一:在mysql系统外,使用mysqladmin # mysqladmin -u root -p password "test123"Enter password: ...

  10. eclipse中maven install和build,clean

    eclipse插件,m2eclipse 1.maven install相当于maven原生的命令: mvn install 2.aven build是 m2eclipse这个插件自己创造的概念,需要你 ...