字节增强java_提高byte的效率

帅子 阅读(792) 评论(0)  编辑  收藏 所属分类: J2EE技术专区

dff12eb2ca60cade0b2b6a4f39b9af78.png

在网络编程中,我们经常要组建自己的网络协议,通常我们把数据按照协议组成byte数组,通过byte数组实现客户端与服务器端的通信,我们可能通过两种方法来组这个byte数组:

1、是通过ByteArrayOutputStream:

ByteArrayOutputStream baos=new ByteArrayOutputStream();

baos.write(data.getBytes());

byte [] ret = baos.toByteArray();

2、是通过ByteBuffer:

在使用ByteBuffer时,我们要使用一个小技巧:因为我们发送的数据长度是不固定的,所以我们不能给ByteBuffer分配固定的容量,如果分配固定的容易,一方面可能造成内存的浪费,另外一方面有可能我们写的数据会超出ByteBuffer的容量。所以我们在申请ByteBuffer空间时,先计算其数据长度:

如果是byte,short,int,long等类型的数据我们都好计算;

如果是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);//后续数据长度

ByteBuffer w_buff = ByteBuffer.allocate(datalen+2);//申请ByteBuffer

//接下来往ByteBuffer填充数据

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));//用户权限

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等类型的数据转换成byte数组(这可是以麻烦的过程呀)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值