內(nèi)蒙古java團隊

          j2se,j2ee開發(fā)組
          posts - 139, comments - 212, trackbacks - 0, articles - 65
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          提高byte的效率

          Posted on 2007-12-20 11:40 帥子 閱讀(898) 評論(0)  編輯  收藏 所屬分類: J2EE技術(shù)專區(qū)
          在網(wǎng)絡(luò)編程中,我們經(jīng)常要組建自己的網(wǎng)絡(luò)協(xié)議,通常我們把數(shù)據(jù)按照協(xié)議組成byte數(shù)組,通過byte數(shù)組實現(xiàn)客戶端與服務(wù)器端的通信,我們可能通過兩種方法來組這個byte數(shù)組:
          1、是通過ByteArrayOutputStream:
          ByteArrayOutputStream baos=new ByteArrayOutputStream();
          baos.write(data.getBytes());
          byte [] ret = baos.toByteArray();
          2、是通過ByteBuffer:
          在使用ByteBuffer時,我們要使用一個小技巧:因為我們發(fā)送的數(shù)據(jù)長度是不固定的,所以我們不能給ByteBuffer分配固定的容量,如果分配固定的容易,一方面可能造成內(nèi)存的浪費,另外一方面有可能我們寫的數(shù)據(jù)會超出ByteBuffer的容量。所以我們在申請ByteBuffer空間時,先計算其數(shù)據(jù)長度:
               如果是byte,short,int,long等類型的數(shù)據(jù)我們都好計算;
              如果是String的話,我們先獲取其getBytes(),然后計算其長度。
          例子:

                          byte [] bs=null;
                          byte len = 0;
                          try {
                                  bs="直播員".getBytes("GBK");
                                  len = (byte) bs.length;
                          } catch (UnsupportedEncodingException e) {
                                  e.printStackTrace();
                                  return result;
                          }
                          short datalen=(short) (2+4+4+1+bs.length+4+4+4+1+1);//后續(xù)數(shù)據(jù)長度
                          ByteBuffer w_buff = ByteBuffer.allocate(datalen+2);//申請ByteBuffer
                          //接下來往ByteBuffer填充數(shù)據(jù)
                          w_buff.putShort(Short.reverseBytes(datalen));
                          short c=0X0416;
                          w_buff.putShort(Short.reverseBytes(c));//登錄命令號
                          w_buff.putInt(Integer.reverseBytes(111));
                          w_buff.putInt(Integer.reverseBytes(2222));
                          
                          w_buff.put(len);//昵稱的長度
                          w_buff.put(bs);//昵稱
                          w_buff.putInt(Integer.reverseBytes(1));//等級
                          w_buff.putInt(Integer.reverseBytes(1));//用戶權(quán)限
                          w_buff.putInt(Integer.reverseBytes(1));//用戶頭像
                          byte sex=0;
                          w_buff.put(sex);//用戶性別
                          byte age=20;
                          w_buff.put(age);//用戶年齡
                          byte [] ret=w_buff.array();

          我個人比較喜歡用第二種方法,因為它的效率比第一種要高出一到兩倍呢。
          而且第二種方法可以不用自己去把short,int,long等類型的數(shù)據(jù)轉(zhuǎn)換成byte數(shù)組(這可是以麻煩的過程呀)。
          主站蜘蛛池模板: 夹江县| 冀州市| 凤山市| 九龙坡区| 双柏县| 衡南县| 额济纳旗| 萍乡市| 邢台市| 余干县| 绵竹市| 开江县| 翼城县| 繁峙县| 呼玛县| 麻城市| 乐业县| 佛冈县| 监利县| 项城市| 北流市| 濉溪县| 富阳市| 原平市| 乌什县| 乌苏市| 高州市| 新民市| 尼勒克县| 蕉岭县| 额济纳旗| 若尔盖县| 桐城市| 平江县| 舒兰市| 凭祥市| 琼中| 西乌珠穆沁旗| 松江区| 奉新县| 封开县|