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 body
2 {
3     char    sessid[33];
4     int        datalen;    
5     BYTE    data[0];    
6 };
View Code

包尾C++結構體示例如下

1 // 包尾 - 粘包分割
2 typedef struct tag_protocol_tail
3 {
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             else
16                 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

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校驗

 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) ^ dwPolynomial
11             else:
12                 dwCrc >>= 1
13         m_pdwCrc32Table[i] = dwCrc
14     dwCrc32 = 0xFFFFFFFFL
15     for i in szString:
16         b = ord(i)
17         dwCrc32 = ((dwCrc32) >> 8) ^ m_pdwCrc32Table[(b) ^ ((dwCrc32) & 0x000000FF)]
18     dwCrc32 = dwCrc32 ^ 0xFFFFFFFFL
19     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 = 0
21     string9 = 0
22     string8 = struct.pack('B', string8)
23     string9 = struct.pack('B', string9)
24 
25     request_head = string1+string2+string3+string4+string5+string6+string7+string8+string9+data
26     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+tail4
12     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+string3
11     return request_body, len(request_body)
View Code

?

轉載于:https://www.cnblogs.com/shhnwangjian/p/5147271.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373747.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373747.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu下安裝OpenSSH Server并在客戶端遠程連接Ubuntu

本文主要是向讀者介紹了如何在Ubuntu系統下安裝OpenSSH Server并在客戶端遠程連接Ubuntu&#xff0c;共有兩種方法&#xff0c;一種是命令行安裝&#xff1b;另一種是通過Ubuntu Software Center安裝&#xff0c;希望對大家能有幫助&#xff01; 方法一&#xff08;推薦&#…

算法:老鼠走迷宮問題

算法&#xff1a;老鼠走迷宮問題(初) 【寫在前面】 老鼠走迷宮問題的遞歸實現&#xff0c;是對遞歸思想的一種應用。 【問題描述】 給定一個二維數組&#xff0c;數組中2表示墻壁&#xff0c;0表示通路&#xff0c;由此數組可展示為一個迷宮圖。給定入口位置和出口位置&#xf…

rust python對比_Python Rust 迭代器對比

迭代是數據處理的基石&#xff0c;而 Python 中所有集合都可以迭代&#xff0c;這是 Python 讓使用者感到非常方便的特征之一。下面是一些在 Python 中經常使用的迭代模式# 列表for i in [1, 2, 3, 4]:print(i)# 字典di {a: 1, b: 2, c: 3}# 迭代鍵for k in di.keys():print(k…

WebSphere Application Server性能調整工具包

IBM已發布了WebSphere Application Server性能調整工具包 &#xff0c;該工具包具有從Eclipse工作區*監視多個 WebSphere Application Server的功能。 該工具使用WAS Performance Monitoring統計信息來獲取并繪制圖表&#xff0c;以指示服務器的運行狀況。 *請注意&#xff0c;…

CentOS 配置防火墻操作實例(啟、停、開、閉端口)

CentOS 配置防火墻操作實例&#xff08;啟、停、開、閉端口&#xff09;&#xff1a; 注&#xff1a;防火墻的基本操作命令&#xff1a; 查詢防火墻狀態: [rootlocalhost ~]# service iptables status<回車> 停止防火墻: [rootlocalhost ~]# service iptables stop &…

linux常用命令-壓縮解壓命令

壓縮解壓命令 目錄 1. 壓縮解壓命令&#xff1a;gzip 2. 壓縮解壓命令&#xff1a;gunzip 3. 壓縮解壓命令&#xff1a;tar 4. 壓縮解壓命令&#xff1a;zip 5. 壓縮解壓命令&#xff1a;unzip 6. 壓縮解壓命令&#xff1a;bzip2 7. 壓縮解壓命令&#xff1a;bunzip2 1. 壓縮解…

達夢數據庫查詢數據庫所有表名_達夢數據庫的一些實用小SQL

1)當前數據庫中的模式名&#xff1a;select distinct object_name TABLE_SCHEMA from all_objects where object_type SCH;2)查出各模式對應的用戶&#xff1a;selectSCH_OBJ.NAME ,SCH_OBJ.ID ,SCH_OBJ.CRTDATE,USER_OBJ.NAMEfrom(select NAME, ID, PID, CRTDATE from …

設置Java EE 6開發環境

本教程簡要說明了如何設置典型的環境來開發基于Java EE 6的應用程序。 除了可以正常工作的Windows XP客戶端具有足夠的CPU能力和內存外&#xff0c;本教程沒有其他先決條件。 在教程中&#xff0c;我們將需要安裝以下組件&#xff1a; Java 6 JDK更新26 用于Java EE開發人員的…

css cursor url用法格式詳解

css cursor url用法格式&#xff1a;css:{cursor:url(圖標路徑),auto;} //IE,FF,chrome瀏覽器都可以 實例代碼&#xff1a;html{cursor: url("http://ued.taobao.com/blog/wp-content/themes/taobaoued/images/cursor.ico"),auto;} 解析&#xff1a;前面的url是自定義…

iostext添加點擊事件_iOS開發小技巧 - label中的文字添加點擊事件

Label中的文字添加點擊事件以前老師講過類似的功能,自己懶得回頭看了,找了很多第三方的,感覺這個小巧便利,作者只是擴展了分類,實現起來代碼也少.先來個效果圖自己的項目,直接上代碼- (void)setTopicModel:(CYQTopicModel *)topicModel{_topicModel topicModel;NSArray *likeA…

ubantu下安裝Nginx

Nginx 概述 Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器&#xff0c;也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的&#xff0c;第一個公開版本0.1.0發布于2004年10月4日。其將源代碼…

Hadoop中的問題–何時無法交付?

Hadoop是很棒的軟件。 它不是原始的&#xff0c;但肯定不能消除它的榮耀。 它建立在并行處理的基礎上&#xff0c;這個概念已經存在了數十年。 Hadoop雖然從概念上來說并不是獨創性的&#xff0c;但它顯示了自由開放的力量&#xff08;就像在啤酒中一樣&#xff01;&#xff09…

創建 dblink

目的&#xff1a;oracle中跨數據庫查詢 兩臺數據庫服務器db_A(本地)和db_B(遠程192.168.1.100)&#xff0c;db_A下用戶user_a 需要訪問到db_B下user_b的數據解決&#xff1a;查詢得知使用dblink(即database link 數據庫鏈)實現過程&#xff1a;1、確定用戶user_a有沒有創…

C#靜態常量和動態常量的區別

C#擁有兩種不同的常量&#xff1a;靜態常量(compile-time constants)和動態常量(runtime constants)。它們有不同的特性&#xff0c;錯誤的使用不僅會損失效率&#xff0c;還可能造成錯誤。相比之下&#xff0c;靜態常量在速度上會稍稍快一些&#xff0c;但是靈活性卻比動態常…

spring的鉤子_高級java開發必須掌握的Spring接口——SmartLifecycle

有些場景我們需要在Spring 所有的bean 完成初始化后緊接著執行一些任務或者啟動需要的異步服務。 常見有幾種解決方案j2ee 注解 啟動前PostConstruct 銷毀前PreDestroy 基于j2ee 規范springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已經介紹過…

Java:對Java SE 6和Java SE 7的客戶端和桌面部分的改進!

Java 6和Java 7中的客戶端改進 了解有關Java SE 6和Java SE 7的客戶端和桌面部分的改進&#xff0c;包括新的applet插件&#xff0c;Java Deployment Toolkit&#xff0c;成形和半透明的窗口&#xff0c;重量級-輕量級混合以及Java Web Start。 介紹 自2006年12月發布Java平臺…

辨異 —— 行星 vs 恒星

star&#xff1a;恒星&#xff0c;planet&#xff1a;行星&#xff1b;1. 恒星 恒星是指宇宙中靠核聚變產生的能量而自身能發熱發光的星體&#xff08;比如太陽&#xff09;。過去天文學家以為恒星的位置是永恒不變的&#xff0c;以此為名。但事實上&#xff0c;恒星也會按照一…

軟件公司職責分配

崗位&#xff1a;項目經理 主要職責&#xff1a;1、 計劃&#xff1a;a)項目范圍、項目質量、項目時間、項目成本的確認。b)項目過程/活動的標準化、規范化。c)根據項目范圍、質量、時間與成本的綜合因素的考慮&#xff0c;進行項目的總體規劃與階段計劃。d)各項計劃得到上級領…

大型網站架構系列:負載均衡詳解(4)

本文是負載均衡詳解的第四篇&#xff0c;主要介紹了LVS的三種請求轉發模式和八種負載均衡算法&#xff0c;以及Haproxy的特點和負載均衡算法。具體參考文章&#xff0c;詳見最后的鏈接。 三、LVS負載均衡 LVS是一個開源的軟件&#xff0c;由畢業于國防科技大學的章文嵩博士于19…

關于JavaFX的最常見問題

上周&#xff0c;我在斯德哥爾摩的Jfokus 2012上做了一個關于JavaFX的演講&#xff0c;當時我意識到每次活動都會問三個問題。 似乎有一個普遍的興趣&#xff0c;所以我嘗試在這篇文章中回答他們&#xff08;盡可能的說實話&#xff09;&#xff1a; iPad或其他移動設備上的Jav…