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

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

包头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. Learning to Rank 之 listwise ranking

    详细文章: http://www.machinelearning.org/proceedings/icml2007/papers/139.pdf

  2. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  3. [转]论acm与泡妞

    abstract :本文从各个方面讨论了泡妞与做题之间的相似之处与不同点,尽量的站在一个公平的角度阐述这一问题,所得的研究成果填补了国内外的理论空白. - 泡了一个好妞就好像做了一道难题一样快感都是相 ...

  4. if -else 条件语句原理

    #!/usr/bin/python # coding utf-8 name = '?' if name == 'python': print('欢迎BOSS') else: print('输入错误')

  5. springMVC+mybatis 增删该操作后判断影响行数一直返回-2147482646

    MyBatis发现更新和插入返回值一直为"-2147482646"的错误是由defaultExecutorType设置引起的,如果设置为BATCH,更新返回值就会丢失.mybati ...

  6. 【BZOJ 1568】【JSOI 2008】Blue Mary开公司

    经典的splay维护凸壳,但是看了看zky学长的题解最后决定写线段树维护标记永久化. Round1考到了这个之后一直没有理解标记永久化,CTSC也因为自己的缺陷丢掉了一些部分分,so sad 看来以后 ...

  7. 大屏iPhone的适配 +iOS 图片尺寸要求

    摘自:http://blog.ibireme.com/2014/09/16/adapted_to_iphone6/ 苹果公司官网设计介绍到:Retina显示屏的超高像素密度已超过人眼能分辨的范围.Re ...

  8. UNIX命令,统计当前目录(含子目录)下所有后缀为.log的文件中ERROR出现的行数

    shell程序如下所示: # cat xarg.txt #! /usr/bin/ksh for logfile in `find . -name "*.log*"` do echo ...

  9. win7下安装redies

    https://github.com/MSOpenTech/redis 打开以后,可以直接使用浏览器下载,或者git克隆.注意:下载release版 解压后,目录下有以下这些文件: redis-ben ...

  10. Xcode插件VVDocumenter Alcatraz KSImageNamed等安装

    今天安装VVDocumenter,总是不起作用...所以用Alcatraz...下面介绍下Alcatraz 一.Alcatraz Alcatraz 是一款 Xcode的插件管理工具,可以用来管理XCo ...