一種數(shù)據(jù)傳輸解析方法與裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種不限大小端模式的數(shù)據(jù)傳輸通用解析方 法。
【背景技術(shù)】
[0002] 在不同的操作平臺中,數(shù)據(jù)最底層存儲(二進(jìn)制方式)的模式并不相同,分為大端 模式和小端模式,所謂大端模式是指在一個需要存儲的數(shù)據(jù)中,該數(shù)據(jù)的低位(即權(quán)值較小 的后面幾位)保存在內(nèi)存中相應(yīng)存儲位置的高地址中,而數(shù)據(jù)的高位,則保存在內(nèi)存中相應(yīng) 存儲位置的低地址中。如:一個4字節(jié)32位變量的16進(jìn)制值為0x12345678,在內(nèi)存中以大端 模式存儲的方式如表1所示:
[0003] 表 1
[0004]
[0005]所謂小端模式,與大端模式恰恰相反,在一個需要存儲的數(shù)據(jù)中,該數(shù)據(jù)的低位保 存在內(nèi)存中相應(yīng)存儲位置的低地址中,而數(shù)據(jù)的高位,則存儲在內(nèi)存中相應(yīng)存儲位置的高 地址中。如:一個4字節(jié)32位變量的16進(jìn)制值為0x12345678,在內(nèi)存中以小端模式存儲的方 式如表2所示:
[0006]表2
[0009] 數(shù)據(jù)在跨平臺通信時,在傳統(tǒng)數(shù)據(jù)通信領(lǐng)域,由于兩個平臺中數(shù)據(jù)最底層存儲的 大小端模式并不匹配,從發(fā)送端到接收端解析數(shù)據(jù)就造成很大麻煩,需要進(jìn)行數(shù)據(jù)大小端 匹配調(diào)整再經(jīng)過移位操作進(jìn)行數(shù)據(jù)還原,如果傳輸數(shù)據(jù)中還存在多包頭數(shù)據(jù)段定義,則需 要重復(fù)進(jìn)行多次大小端數(shù)據(jù)匹配和數(shù)據(jù)移位操作。比如:
[0010] -個以大端模式存儲的系統(tǒng)發(fā)送4字節(jié)數(shù)據(jù)通過TCP/IP協(xié)議到一個以小端模式存 儲的系統(tǒng)中,則需要如下解析:
[00111 Unsigned char**p;//數(shù)據(jù)讀取內(nèi)存指針
[0012] Unsigned int RecvData;//接收端定義變量
[0013] *p = 0x4000 ;
[0014] RecvData=*[*p]*0x100 0000+*[*p+l]*0x100 00+*[*p+2]*0x100 +*[*p+3];
[0015] 如果一個以小端模式存儲的系統(tǒng)發(fā)送4字節(jié)數(shù)據(jù)通過TCP/IP協(xié)議到一個以小端模 式存儲的系統(tǒng)中,則需要如下解析:
[0016] RecvData=*[*pI+3]*0χ1000000+*[*ρ+2]*0χ10000+*[*ρ+1]*0χ100+*[*ρ];
[0017] 這只是4個字節(jié)單變量數(shù)據(jù)的解析,如果發(fā)的是多字節(jié)或者不定長字節(jié)多變量多 包頭的二進(jìn)制數(shù)據(jù),這個解析是災(zāi)難性的。因此,亟需一種更優(yōu)的技術(shù)方案來解決這一技術(shù) 問題。
【發(fā)明內(nèi)容】
[0018] 本發(fā)明的目的是提供一種數(shù)據(jù)傳輸解析方法,用以解決現(xiàn)有數(shù)據(jù)傳輸解析方法中 數(shù)據(jù)處理復(fù)雜、耗費CPU資源多、人工解析出錯概率大的問題。
[0019] 為實現(xiàn)上述目的,本發(fā)明的方案包括:
[0020] -種數(shù)據(jù)傳輸解析方法,包括如下步驟:
[0021 ]步驟1):定義發(fā)送端需要發(fā)送的數(shù)據(jù)量并賦值,同時定義和設(shè)置發(fā)送端的結(jié)構(gòu)體 對象;
[0022] 步驟2):定義接收端的結(jié)構(gòu)體對象;
[0023] 步驟3):進(jìn)行數(shù)據(jù)傳輸,將發(fā)送端結(jié)構(gòu)體對象所發(fā)送的每個子項數(shù)據(jù)解析到接收 端結(jié)構(gòu)體對象的每個子項中。
[0024] 進(jìn)一步的,所述發(fā)送端的數(shù)據(jù)存儲模式是小端存儲模式或大端存儲模式,所述接 收端的數(shù)據(jù)存儲模式是大端存儲模式或小端存儲模式。
[0025]進(jìn)一步的,所述發(fā)送端與接收端的通信采用Socket函數(shù)進(jìn)行通信。
[0026] -種數(shù)據(jù)傳輸解析裝置,其特征在于,包括如下模塊:
[0027] 模塊1:用于定義發(fā)送端需要發(fā)送的數(shù)據(jù)量并賦值,同時定義和設(shè)置發(fā)送端的結(jié)構(gòu) 體變量;
[0028] 模塊2:用于定義接收端的結(jié)構(gòu)體變量;
[0029] 模塊3:用于進(jìn)行數(shù)據(jù)傳輸,將發(fā)送端結(jié)構(gòu)體對象所發(fā)送的每個子項數(shù)據(jù)解析到接 收端結(jié)構(gòu)體對象的每個子項中。
[0030] 進(jìn)一步的,所述發(fā)送端的數(shù)據(jù)存儲模式是小端存儲模式或大端存儲模式,所述接 收端的數(shù)據(jù)存儲模式是大端存儲模式或小端存儲模式。
[0031] 進(jìn)一步的,所述發(fā)送端與接收端的通信采用Socket函數(shù)進(jìn)行通信。
[0032] 本方法通過發(fā)送端與接收端利用匹配數(shù)據(jù)結(jié)構(gòu)體對象指針對接,不用進(jìn)行大小端 模式匹配和移位操作進(jìn)行數(shù)據(jù)還原,直接通過結(jié)構(gòu)體對象指針接收,讓系統(tǒng)內(nèi)部定義的結(jié) 構(gòu)體子項進(jìn)行自動對應(yīng)達(dá)到數(shù)據(jù)自動還原的目的。這樣通過結(jié)構(gòu)體對象的子項自動對應(yīng)達(dá) 到數(shù)據(jù)自動還原的方式,能夠避免人工解析時出錯概率高的問題,同時占用的CPU資源較 少,而且不需要對數(shù)據(jù)進(jìn)行逐一的解析,有效的減少了數(shù)據(jù)處理的復(fù)雜程度,提高了數(shù)據(jù)傳 輸時進(jìn)行數(shù)據(jù)解析的效率。
【具體實施方式】
[0033] 下面對本發(fā)明做進(jìn)一步詳細(xì)的說明。
[0034] 本發(fā)明通過結(jié)構(gòu)體對象指針讀取內(nèi)存子項自動對應(yīng)的方式,不需要數(shù)據(jù)移位解析 也不必考慮發(fā)送端是大端模式還是小端模式,唯一需要發(fā)送端發(fā)送時是以結(jié)構(gòu)體對象指針 進(jìn)行發(fā)送的,接收端接收時是以結(jié)構(gòu)體對象指針進(jìn)行接收的,發(fā)送端和接收端結(jié)構(gòu)體定義 必須保證一致。
[0035] 下面通過一個具體的例子對本發(fā)明的技術(shù)方案做詳細(xì)說明。
[0036] 在Linux操作系統(tǒng)中,數(shù)據(jù)在最底層存儲的模式為大端模式,而Windows操作系統(tǒng) 中在最底層中數(shù)據(jù)存儲的模式則是小端模式,在二者進(jìn)行數(shù)據(jù)傳輸通信時采用結(jié)構(gòu)體對象 的方式進(jìn)行通信。在這里,設(shè)置Linux操作系統(tǒng)為發(fā)送端,Windows為接收端,二者通過Tcp/ Ip協(xié)議網(wǎng)路發(fā)送數(shù)據(jù)。在進(jìn)行數(shù)據(jù)發(fā)送之前,首先對需要發(fā)送的變量進(jìn)行定義,并為他們賦 值,具體的,定義和賦值過程根據(jù)下述代碼進(jìn)行:
[0037] g-Send-zaihe-inf 〇. f-4M-count = 1050;
[0038] g-Send-zaihe-info · f-end-f ile-id = 9900;
[0039] g-Send-zaihe-info·f-end-height = 16780;
[0040] g-Send-zaihe-info · f-end-jd = 134 · 65;
[0041 ] g-Send-zaihe-info, f-end-wd = 35.67;
[0042] g-Send-zaihe-info · f-kaiji-num= 10;
[0043] g-Send-zaihe-info · f_task_id = 0g;
[0044] g-Send-zaihe-info · f-start-time · nian = 2015;
[0045] g-Send-zaihe-inf o · f-start-time · yue = 4;
[0046] g_Send_zaihe_inf o. f_start_time. ri = 10 ;
[0047] g-Send-zaihe-info · f-start-time · shi = 15;
[0048] g-Send-zaihe-info · f-start-time · fen = 55;
[0049] g-Send-zaihe-info · f-start-time .miao = 50;
[0050] g_Send_zaihe_info. f_end_time .nian = 2016 ;
[0051 ] g_Send_zaihe_inf o. f_end_time. yue = 04 ;
[0052] g_Send_zaihe_inf o. f_end_time. ri = 10 ;
[0053] g_Send_zaihe_info. f_end_time. shi = 15 ;
[0054] g_Send_zaihe_info. f_end_time. fen = 10 ;
[0055] g_Send_zaihe_info. f_end_time .miao = 10 ;
[0056] conn_fd=accept(sock_fd?(struct sockaddr*)&cli-addr,&cli_len);
[0057] send(conn_fd,&g_Send_zaihe_info,sizeof(g_Send_zaihe_info),0);
[0058] 在對需要發(fā)送的數(shù)據(jù)進(jìn)行定義和賦值完成后,則開始設(shè)置發(fā)送端的結(jié)構(gòu)體對象, 在這里發(fā)送端的結(jié)構(gòu)體數(shù)據(jù)變量為"g_Send_zaihe_info",其具體定義過程如下:
[ΟΟ?Ο]發(fā)送端結(jié)構(gòu)體變量"g_Send_zaihe_info"定義完成后,定義和賦值的各需要發(fā)送 的數(shù)據(jù)在發(fā)送端結(jié)構(gòu)體變量"g_Send_zaihe_info"中的存儲格式為:
[0065] 在接收端Windows操作系統(tǒng)中設(shè)置接收端結(jié)構(gòu)體對象"m_Recv_data",具體設(shè)置過 程如下:
[0067] 設(shè)置完成以后,則開始從發(fā)送端到接收端的通信,發(fā)送端到接收端的通信采用 Socket函數(shù)進(jìn)行通信,從上述接收端和發(fā)送端中結(jié)構(gòu)體對象的設(shè)置過程中可以看出,接收 端和發(fā)送端使用了同一個結(jié)構(gòu)體對象來發(fā)送和接收數(shù)據(jù)。在數(shù)據(jù)通信過程中,發(fā)送端以結(jié) 構(gòu)體對象的方式進(jìn)行數(shù)據(jù)發(fā)送,而接收端同樣采用結(jié)構(gòu)體對象接收,具體的,發(fā)送端"g_ Send_zaihe_info"結(jié)構(gòu)體對象所發(fā)送的每個子項數(shù)據(jù)成功解析到接收端"m_Recv_data"結(jié) 構(gòu)體對象的每個子項中,接收端"m_Recv_data"結(jié)構(gòu)體對象指針進(jìn)行系統(tǒng)內(nèi)部自動匹配。
[0068] 以上給出了本發(fā)明具體的實施方式,但本發(fā)明不局限于所描述的實施方式。在本 發(fā)明給出的思路下,采用對本領(lǐng)域技術(shù)人員而言容易想到的方式對上述實施例中的技術(shù)手 段進(jìn)行變換、替換、修改,并且起到的作用與本發(fā)明中的相應(yīng)技術(shù)手段基本相同、實現(xiàn)的發(fā) 明目的也基本相同,這樣形成的技術(shù)方案是對上述實施例進(jìn)行微調(diào)形成的,這種技術(shù)方案 仍落入本發(fā)明的保護(hù)范圍內(nèi)。
【主權(quán)項】
1. 一種數(shù)據(jù)傳輸解析方法,其特征在于,包括如下步驟: 步驟1):定義發(fā)送端需要發(fā)送的數(shù)據(jù)量并賦值,同時定義和設(shè)置發(fā)送端的結(jié)構(gòu)體對象; 步驟2):定義接收端的結(jié)構(gòu)體對象; 步驟3):進(jìn)行數(shù)據(jù)傳輸,將發(fā)送端結(jié)構(gòu)體對象所發(fā)送的每個子項數(shù)據(jù)解析到接收端結(jié) 構(gòu)體對象的每個子項中。2. 根據(jù)權(quán)利要求1所述的一種數(shù)據(jù)傳輸解析方法,其特征在于,所述發(fā)送端的數(shù)據(jù)存儲 模式是小端存儲模式或大端存儲模式,所述接收端的數(shù)據(jù)存儲模式是大端存儲模式或小端 存儲模式。3. 根據(jù)權(quán)利要求1所述的一種數(shù)據(jù)傳輸解析方法,其特征在于,所述發(fā)送端與接收端的 通?目米用Socket函數(shù)進(jìn)彳丁通{目。4. 一種數(shù)據(jù)傳輸解析裝置,其特征在于,包括如下模塊: 模塊1:用于定義發(fā)送端需要發(fā)送的數(shù)據(jù)量并賦值,同時定義和設(shè)置發(fā)送端的結(jié)構(gòu)體變 量; 模塊2:用于定義接收端的結(jié)構(gòu)體變量; 模塊3:用于進(jìn)行數(shù)據(jù)傳輸,將發(fā)送端結(jié)構(gòu)體對象所發(fā)送的每個子項數(shù)據(jù)解析到接收端 結(jié)構(gòu)體對象的每個子項中。5. 根據(jù)權(quán)利要求4所述的一種數(shù)據(jù)解析裝置,其特征在于,所述發(fā)送端的數(shù)據(jù)存儲模式 是小端存儲模式或大端存儲模式,所述接收端的數(shù)據(jù)存儲模式是大端存儲模式或小端存儲 模式。6. 根據(jù)權(quán)利要求4所述的一種數(shù)據(jù)解析裝置,其特征在于,所述發(fā)送端與接收端的通信 米用Socket函數(shù)進(jìn)彳丁通{目。
【專利摘要】本發(fā)明涉及一種數(shù)據(jù)傳輸解析方法與裝置,包括如下步驟:1):定義發(fā)送端需要發(fā)送的數(shù)據(jù)量并賦值,同時定義和設(shè)置發(fā)送端的結(jié)構(gòu)體對象;2):定義接收端的結(jié)構(gòu)體對象;3):進(jìn)行數(shù)據(jù)傳輸,將發(fā)送端結(jié)構(gòu)體對象所發(fā)送的每個子項數(shù)據(jù)解析到接收端結(jié)構(gòu)體對象的每個子項中。本方法通過結(jié)構(gòu)體對象的子項自動對應(yīng)達(dá)到數(shù)據(jù)自動還原的方式,能夠避免人工解析時出錯概率高的問題,同時占用的CPU資源較少,而且不需要對數(shù)據(jù)進(jìn)行逐一的解析,有效的減少了數(shù)據(jù)處理的復(fù)雜程度,提高了數(shù)據(jù)傳輸時進(jìn)行數(shù)據(jù)解析的效率。
【IPC分類】G06F3/06
【公開號】CN105549900
【申請?zhí)枴緾N201510887897
【發(fā)明人】張衡
【申請人】中國航空工業(yè)集團(tuán)公司洛陽電光設(shè)備研究所
【公開日】2016年5月4日
【申請日】2015年12月5日