理论部分

一个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. 谈谈字符集编码及gb2312、utf-8编码原理

    一.基础中的基础比特位即bit,是计算机最小的存储单位.以0或1来表示比特位的值.Byte是字节数,bit是位数,在计算机中每八位为一字节,也就是1Byte=8bit:Byte和bit都翻译成比特,俗 ...

  2. sql相关语言

    SQL 掌握一门编程语言: C C++ Java C# ... 数据库 数据结构/算法 链表 队列 栈 数组 面向对象 网络 (界面.业务逻辑) 关系型数据库: 以二维表的形式组织数据 表.索引.视图 ...

  3. 如何在Windows Server 2016启用或关闭Internet Explorer增强的安全配置

    一般我们安装完服务器后,开启 Internet Explorer 会发现无法上网或者上网内容被屏蔽掉了 问题的发生原因 在 Windows Server 2016 通常扮演重要的服务器角色,不应该用来 ...

  4. 封装 INI 文件读写函数

    delphi读写ini文件实例 //--两个过程,主要实现:窗体关闭的时候,文件保存界面信息:窗体创建的时候,程序读取文件文件保存的信息. //--首先要uses IniFiles(单元) //--窗 ...

  5. html标签的嵌套规则分析

    1.a标签最好不要嵌套块级元素,可以嵌套内联元素,但是不能嵌套a标签和input之类的标签.能嵌套的标签像,等等. 2.ul和ol的子元素不能是别的元素只能是li,不能是别的比如div等,但是li中可 ...

  6. PrefixSpan算法原理总结

    前面我们讲到频繁项集挖掘的关联算法Apriori和FP Tree.这两个算法都是挖掘频繁项集的.而今天我们要介绍的PrefixSpan算法也是关联算法,但是它是挖掘频繁序列模式的,因此要解决的问题目标 ...

  7. HDU5914

    Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  8. 微信小程序维护登录态与获取用户信息

    前言. 微信小程序的运行环境不是在浏览器下运行的.所以不能以cookie来维护登录态.下面我就来说说我根据官方给出的方法来写出的维护登录态的方法吧. 一.登录态维护 官方的文档地址:https://m ...

  9. ubuntu 笔记一

    注:ubuntu14.04 64位 1.刚安装的ubuntu无法在终端使用su 原因:root没有默认密码,需要手动设定. 解决方法:以具有sudo权限的用户登录 给root用户设置密码:打开一个te ...

  10. Unity随手记

    过年11天假期,带娃带了7天,吃吃喝喝.也看了点书,<射雕英雄传>(书)看了一半,还有就是在看<unity官方案例精讲>这本. 随手记一些自觉有价值或者有意思的点. 1. 对脚 ...