国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C與java通訊小結

C與java通訊小結

(2010-09-19 15:36:49)
標簽:

雜談

分類: Java學習
 
 最近在做java和c的UDP通信,才發(fā)現(xiàn)自己的通信基礎知識基本為0,汗一個。。不過還好,在大家的幫助下,終于完成了。。下面寫下一些小的總結。
(1)字節(jié)序問題:這個是通訊的大問題。。前面幾篇文章也轉載了查閱到的一些資料??偟膩碚fC一般使用的是小尾存儲數(shù)據(jù),而java使用大尾存儲,所謂大尾存儲就是數(shù)據(jù)高字節(jié)在前,低字節(jié)在后存儲。而網(wǎng)絡中的數(shù)據(jù)則都是大尾存儲。另字符串在傳輸過程中不會發(fā)生變化,而int,long等數(shù)值類型的數(shù)據(jù)會經(jīng)過根據(jù)大小尾進行存儲傳輸。所以當java與c進行通信的時候,java一段數(shù)據(jù)基本不用進行大小尾轉化,而c收到數(shù)據(jù)后要進行NToH轉化,發(fā)送數(shù)據(jù)的時候也要進行HToN數(shù)據(jù)轉化。再加上字符串,打成包傳輸即可。
(2)傳輸包問題:總所周知,傳輸數(shù)據(jù)不可能一個字節(jié)一個字節(jié)發(fā)送,沒有意義,當然要打成代表一定意義的包進行發(fā)送,包就要有包頭,包尾。比如下面包的定義:

消息結構

項目

說明

Message Header

消息頭(所有消息公共包頭)

Message Body

消息體

 

消息頭格式MessageHeader

字段名

字節(jié)數(shù)

類型

描述

Total_Length  

4

Unsigned  Integer

消息總長度(含消息頭及消息體)

Command_Id

4

Unsigned Integer

命令或響應類型

Sequence_Id

4

Unsigned Integer

消息流水號,順序累加,步長為1,循環(huán)使用(一對請求和應答消息的流水號必須相同)

Version

4

Unsigned Integer

表示,當前網(wǎng)站與AS核心代碼通訊的版本號。目前的版本號為:0x0002


消息體如下:

發(fā)送請求:

字段名

字節(jié)數(shù)

類型

描述

AS服務器名稱

22

Octet String

AS服務器名稱

機構名稱

22

Octet String

機構名稱

起始日期

4

Unsigned Integer

證書有效起始日期

結束日期

4

Unsigned Integer

證書有效終結日期

 

響應

字段名

字節(jié)數(shù)

類型

描述

AS服務器名稱

22

Octet String

AS服務器名稱

機構名稱

22

Octet String

機構名稱

證書路徑

128

Unsigned string

證書在本機存儲路徑

結果值

1

char

0:解析正確,1:解析錯誤

 

這樣當發(fā)送的時候需要把消息頭和消息體構建出來,并全部轉化成byte數(shù)組,再進行傳輸。
再者對數(shù)據(jù)包發(fā)送的時候,是根據(jù)接口文件的。。也就是java和c通訊接口文件,自己定義的了,一致就行。這里面如上面包格式所示,都定義好了每個字段的長度,那么當讀取的時候也要根據(jù)這個長度進行讀取。那么當實際的長度沒有這么長怎么辦呢?那就需要雙方定義好填充字符,是使用空字符('\0')呢,還是空格('')呢,c里面讀取一般遇到空字符就停止。所以使用空字符會比較普遍一些。當java接收到數(shù)據(jù)后,也要根據(jù)找個字符解析出真正長度的字符串。比如使用下面函數(shù)去掉后面的空字符:
    privateString getRealData(byte[] temp){
       String res =new String(temp);
       int end =res.indexOf('\0');
       Stringresult = res.substring(0,end);
       returnresult;
    }
而java得到包之后,如何得到每個字段呢,這個沒有別的辦法了,只能一段一段的拷貝了。下面是我使用的拷貝方法:
private String getServerName() {
       byte[] temp= new byte[22];
       System.arraycopy(this.getRawData(), 1,temp, 0, temp.length);
       StringencodeStr = getRealData(temp);
       return newString(Base64.decode(encodeStr.getBytes()));
    }
而c中則使用結構體就可以了。定義好結構體,接受的之后直接接受結構體,然后根據(jù)結構體讀取,方便快捷,java這方面確實有點麻煩了。
(3)byte,string區(qū)別:本來以為傳輸?shù)臅r候就是string類型字符串,原來根本不是一回事。網(wǎng)絡上傳輸數(shù)據(jù)都是字節(jié)碼,就是我們常說的ascII碼的,對應到類型上就是byte類型的。而string只是java中一種對象而已。而且java中編碼一般是unicode編碼的,要進行和byte類型的轉化。int和long類型的也要進行int2byte轉化。
接收到數(shù)據(jù)之后,則要進行byte2int轉化。且值得注意的是int轉成byte并不是直接字符串的轉化,比如123轉成字符串就是123,但是轉成byte就不是了。它要根據(jù)整數(shù)123所占的字節(jié),得到每個字節(jié)的值,再轉成byte數(shù)組。常用的轉化函數(shù)有:
//int2byte
public static byte[] intToByte(int n) {
       byte[] b =new byte[4];
       b[0] =(byte) (n >> 24);
       b[1] =(byte) (n >> 16);
       b[2] =(byte) (n >> 8);
       b[3] =(byte) (n);
       returnb;
    }

    publicstatic void int2byte(int n, byte buf[], int offset) {
       buf[offset]= (byte) (n >> 24);
       buf[offset1] = (byte) (n >> 16);
       buf[offset2] = (byte) (n >> 8);
       buf[offset3] = (byte) n;
    }

    //字節(jié)類型轉成int類型
    publicstatic int byte2int(byte b[]) {
       return b[3]& 0xff | (b[2] & 0xff)<< 8 | (b[1] & 0xff)<< 16
             | (b[0]& 0xff) << 24;
    }
//short2byte
public static byte[] short2byte(int n) {
       byte b[] =new byte[2];
       b[0] =(byte) (n >> 8);
       b[1] =(byte) n;
       returnb;
    }
// long到byte的轉換
    publicstatic byte[] long2byte(long n) {
       byte b[] =new byte[8];
       b[0] =(byte) (int) (n >> 56);
       b[1] =(byte) (int) (n >> 48);
       b[2] =(byte) (int) (n >> 40);
       b[3] =(byte) (int) (n >> 32);
       b[4] =(byte) (int) (n >> 24);
       b[5] =(byte) (int) (n >> 16);
       b[6] =(byte) (int) (n >> 8);
       b[7] =(byte) (int) n;
       returnb;
    }
等等,注意:這里只是進行普通的字節(jié)碼和數(shù)值之間的類型轉換,并不進行高低位轉化。原因前面已經(jīng)說過了,java和網(wǎng)絡字符是一樣的,都是高位前,低位后,所以不用進行轉化。

(4)中文傳輸問題:
網(wǎng)絡中傳輸中文極易出現(xiàn)亂碼,那怎么辦比較好呢,對了,就是對中文進行編碼,常用的是Base64編碼。再對編碼后數(shù)據(jù)進行傳輸,接收到后也要先進行base64解碼即可。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java基本數(shù)據(jù)類型轉換
java類型之間的轉換
JAVA數(shù)據(jù)類型轉換
總結Java標準類庫中類型相互轉化的方法
包裝類
好程序員Java教程分享Java之包裝類與常用類
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服