字节增强java_提高byte的效率
帥子 閱讀(792) 評(píng)論(0) ?編輯 ?收藏 所屬分類(lèi): J2EE技術(shù)專(zhuān)區(qū)
在網(wǎng)絡(luò)編程中,我們經(jīng)常要組建自己的網(wǎng)絡(luò)協(xié)議,通常我們把數(shù)據(jù)按照協(xié)議組成byte數(shù)組,通過(guò)byte數(shù)組實(shí)現(xiàn)客戶端與服務(wù)器端的通信,我們可能通過(guò)兩種方法來(lái)組這個(gè)byte數(shù)組:
1、是通過(guò)ByteArrayOutputStream:
ByteArrayOutputStream?baos=new?ByteArrayOutputStream();
baos.write(data.getBytes());
byte?[]?ret?=?baos.toByteArray();
2、是通過(guò)ByteBuffer:
在使用ByteBuffer時(shí),我們要使用一個(gè)小技巧:因?yàn)槲覀儼l(fā)送的數(shù)據(jù)長(zhǎng)度是不固定的,所以我們不能給ByteBuffer分配固定的容量,如果分配固定的容易,一方面可能造成內(nèi)存的浪費(fèi),另外一方面有可能我們寫(xiě)的數(shù)據(jù)會(huì)超出ByteBuffer的容量。所以我們?cè)谏暾?qǐng)ByteBuffer空間時(shí),先計(jì)算其數(shù)據(jù)長(zhǎng)度:
如果是byte,short,int,long等類(lèi)型的數(shù)據(jù)我們都好計(jì)算;
如果是String的話,我們先獲取其getBytes(),然后計(jì)算其長(zhǎng)度。
例子:
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ù)長(zhǎng)度
ByteBuffer?w_buff?=?ByteBuffer.allocate(datalen+2);//申請(qǐng)ByteBuffer
//接下來(lái)往ByteBuffer填充數(shù)據(jù)
w_buff.putShort(Short.reverseBytes(datalen));
short?c=0X0416;
w_buff.putShort(Short.reverseBytes(c));//登錄命令號(hào)
w_buff.putInt(Integer.reverseBytes(111));
w_buff.putInt(Integer.reverseBytes(2222));
w_buff.put(len);//昵稱(chēng)的長(zhǎng)度
w_buff.put(bs);//昵稱(chēng)
w_buff.putInt(Integer.reverseBytes(1));//等級(jí)
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();
我個(gè)人比較喜歡用第二種方法,因?yàn)樗男时鹊谝环N要高出一到兩倍呢。
而且第二種方法可以不用自己去把short,int,long等類(lèi)型的數(shù)據(jù)轉(zhuǎn)換成byte數(shù)組(這可是以麻煩的過(guò)程呀)。
總結(jié)
以上是生活随笔為你收集整理的字节增强java_提高byte的效率的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java中的重写与重载_java中的重写
- 下一篇: java格式错误什么意思_java.io