理论部分

一个long占8byte,大多数应用数值不超过int每次传输多4byte会很浪费

有没有什么办法可以压缩long或int呢?

答案是有的,原理好简单,如果数值不超过int.max_value的话就"自动变成"int类型

现在问题又出现了读取时如果知道原来的类型是什么?

可以先写一个byte是什么类型,再写入值,读时先读一个byte,根据类型做不同解释

源码解读

 public abstract class PacketUtil {

     public final static byte BIT_8 = Byte.MAX_VALUE;
public final static short BIT_16 = Short.MAX_VALUE;
public final static int BIT_32 = Integer.MAX_VALUE;
public final static long BIT_64 = Long.MAX_VALUE;
/***
读取自适应数字
*/
public static Number autoReadNum(int offset, byte[] bytes) {
byte bit = bytes[offset];
offset++;
Number ret = null;
switch (bit) {
case 9: //readLong
ret = readLong(offset, bytes);
break;
case 5: //readInt
ret = readInt(offset, bytes);
break;
case 3: //readShort
ret = readShort(offset, bytes);
break;
case 2: //readByte
ret = readByte(offset, bytes);
break;
case 1: //zero
ret = (byte) 0;
break;
default:
throw new QSocketException(QCode.SOCKET_UNKNOWN_OPCODE, "auto bytes unknown opcode :" + bit);
} return ret;
}
/***
写入自适应数字
*/
public static byte autoWriteNum(int offset, Number v, byte[] ret) {
byte bit = getAutoWriteLen(v);
writeByte(offset, bit, ret);
offset++;
switch (bit) {
case 9: //writeLong
writeLong(offset, v.longValue(), ret);
break;
case 5: //writeInt
writeInt(offset, v.intValue(), ret);
break;
case 3: //writeShort
writeShort(offset, v.shortValue(), ret);
break;
case 2: //writeByte
writeByte(offset, v.byteValue(), ret);
break;
case 1: //zero
break;
default:
throw new QSocketException(QCode.SOCKET_UNKNOWN_OPCODE, "auto bytes unknown opcode :" + bit);
}
return bit;
}
/***
获取自适合数字大小
*/
public static byte getAutoWriteLen(Number value) {
long v = value.longValue();
if (v < 0) {
v = -v;
}
byte bit = 0;
//如果为零返回类型为0
if (v == 0) {
bit = 1;
} else if (v > BIT_32) { //如果超过int max 认为是long类型
bit = 9;
} else if (v > BIT_16) {//如果超过short max 认为是int类型
bit = 5;
} else if (v > BIT_8) { //如果超过byte max 认为是short类型
bit = 3;
} else { //否则为byte类型
bit = 2;
}
return bit;
}
}

如果数值为0时,可以减小到1byte,少于short.max_value 占3byte,减少60%空间

[编织消息框架][设计协议]优化long,int转换的更多相关文章

  1. [编织消息框架][设计协议]bit基础

    理论部分 1字节等于8比特,也就是8个二进数,如下面公式 1Byte = 8bits = 0111 1111 1Short = 2Btye 1Int = 4Byte 那学这些有什么用呢? 可以用来做数 ...

  2. [编织消息框架][设计协议]opCode

    OpCode的全称 OpCode(Operation Code) 操作码的意思. OpCode 有几种域组成,不同领域格式组成不同 1.指令号 2.数据范围 3.数据内容 如 {code}{addr ...

  3. [编织消息框架][netty源码分析]2 eventLoop

    eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...

  4. [编织消息框架][netty源码分析]4 eventLoop 实现类NioEventLoop职责与实现

    NioEventLoop 是jdk nio多路处理实现同修复jdk nio的bug 1.NioEventLoop继承SingleThreadEventLoop 重用单线程处理 2.NioEventLo ...

  5. [编织消息框架][网络IO模型]BIO

    既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...

  6. [编织消息框架][netty源码分析]14 PoolChunk 的 PoolSubpage

    final class PoolSubpage<T> implements PoolSubpageMetric { //该page分配的chunk final PoolChunk<T ...

  7. [编织消息框架][JAVA核心技术]数值与逻辑分离

    为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...

  8. [编织消息框架][netty源码分析]3 EventLoop 实现类SingleThreadEventLoop职责与实现

    eventLoop是基于事件系统机制,主要技术由线程池同队列组成,是由生产/消费者模型设计,那么先搞清楚谁是生产者,消费者内容 SingleThreadEventLoop 实现 public abst ...

  9. [编织消息框架][JAVA核心技术]jdk动态代理

    需要用到的工具  jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.Invocation ...

随机推荐

  1. 【转】sql语句的优化分析

    开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...

  2. Spring框架中整合JUnit单元测试的方法

    一. 步骤: 1. 拷贝jar包: 1. JUnit-4.9.jar和spring-test-4.2.4.RELEASE.jar ; 2. 替换原来的main函数: 1. 在测试类上使用注解方式替换: ...

  3. C#的显式接口和隐式接口(转载)

    接口的实现分为:隐式实现和显式实现.如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现.显示实现是通过使用接口的完全限定名来实现接口成员 ...

  4. UGUI batch 规则和性能优化

    UGUI batch 规则和性能优化 (基础) Unity 绘图性能优化 - Draw Call Batching : http://docs.unity3d.com/Manual/DrawCallB ...

  5. StackView的功能和用法

    StackView也是AdapterViewAnimator的子类,它也用于显示Adapter提供的系列View.SackView将会以“堆叠(Stack)”方式来显示多个列表项. 为了控制Stack ...

  6. july教你如何迅速秒杀掉:99%的海量数据处理面试题

    作者:July出处:结构之法算法之道blog 以下是原博客链接网址 http://blog.csdn.net/v_july_v/article/details/7382693 微软面试100题系列 h ...

  7. Service介绍(MediaPlayer应用)

    一.Service介绍 Service类似于Windows中的服务,没有界面,只是在后台运行:而服务不能自己运行,而是需要调用Context.startService(Intent intent);或 ...

  8. Java学习之旅基础知识篇:数组及引用类型内存分配

    在上一篇中,我们已经了解了数组,它是一种引用类型,本篇将详细介绍数组的内存分配等知识点.数组用来存储同一种数据类型的数据,一旦初始化完成,即所占的空间就已固定下来,即使某个元素被清空,但其所在空间仍然 ...

  9. Jsoup后台解析html、jsp网页

    在一些网络爬虫或者从第三方网站抓取信息的程序都面临1个问题,如何从网页中把所需的信息提取出来,Jsoup是个比较好的选择,它能把网站内容解析成Document,再从document中取element就 ...

  10. linux上静态库链接的有关问题

    求大神,linux下静态库链接的问题有两个文件和一个库,a.c, b.c,libh.a,其中b.c里面会有调用libh.a的函数func1,现在将a.c, b.c,libh.a编译链接生成可执行文件, ...