[编织消息框架][设计协议]优化long,int转换
理论部分
一个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转换的更多相关文章
- [编织消息框架][设计协议]bit基础
理论部分 1字节等于8比特,也就是8个二进数,如下面公式 1Byte = 8bits = 0111 1111 1Short = 2Btye 1Int = 4Byte 那学这些有什么用呢? 可以用来做数 ...
- [编织消息框架][设计协议]opCode
OpCode的全称 OpCode(Operation Code) 操作码的意思. OpCode 有几种域组成,不同领域格式组成不同 1.指令号 2.数据范围 3.数据内容 如 {code}{addr ...
- [编织消息框架][netty源码分析]2 eventLoop
eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...
- [编织消息框架][netty源码分析]4 eventLoop 实现类NioEventLoop职责与实现
NioEventLoop 是jdk nio多路处理实现同修复jdk nio的bug 1.NioEventLoop继承SingleThreadEventLoop 重用单线程处理 2.NioEventLo ...
- [编织消息框架][网络IO模型]BIO
既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...
- [编织消息框架][netty源码分析]14 PoolChunk 的 PoolSubpage
final class PoolSubpage<T> implements PoolSubpageMetric { //该page分配的chunk final PoolChunk<T ...
- [编织消息框架][JAVA核心技术]数值与逻辑分离
为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...
- [编织消息框架][netty源码分析]3 EventLoop 实现类SingleThreadEventLoop职责与实现
eventLoop是基于事件系统机制,主要技术由线程池同队列组成,是由生产/消费者模型设计,那么先搞清楚谁是生产者,消费者内容 SingleThreadEventLoop 实现 public abst ...
- [编织消息框架][JAVA核心技术]jdk动态代理
需要用到的工具 jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.Invocation ...
随机推荐
- iOS 专题 之 界面开发 之 控件
iOS 之 UIViewController iOS 之 Navagation Button iOS 之 UIButton iOS 之 UITextField iOS 之 UIStackView iO ...
- 笔记整理——C语言-http-1
http 传输原理及格式 - friping - ITeye技术网站 - Google Chrome (2013/4/1 14:02:36) http 传输原理及格式 博客分类: 其他 应用服务器浏览 ...
- imageX及其安装windows
/capture 将卷映像捕获到新 WIM 文件中(备份成wim) imagex /capture g: e:\7setted.wim "Drive G" /apply ...
- iOS网络高级编程:iPhone和iPad的企业应用开发(书籍学习)
作者:Jack Cox.Nathan Jones.John Szumski 译者:张龙 勘误 前言 第 I 部分 理解iOS与企业网络 这一部分从高层次概览了iOS网络以及针对移动网络架构的最佳 ...
- iOS 错误 之 http请求
Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is ins ...
- JS的组成部分、引入页面的方法以及命名规范
JS的组成部分.引入页面的方法以及命名规范 一.页面是由三部分组成 1)html标签(超文本标记语言) 2)css样式(层叠样式表) 3)javascript脚本编程语言(动态脚本语言) 二.将c ...
- Selenium2(java)selenium常用API 四
WebElement相关方法 1.点击操作 WebElement button = driver.findElement(By.id("login")); button.click ...
- js架构设计模式——前端MVVM框架设计及实现(一)
前端MVVM框架设计及实现(一) 最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我 ...
- XMLSocket的bug
"<cross-domain-policy>" "<site-control permitted-cross-domain-policies=\&quo ...
- 关于我的PP0.1聊天软件(客户端)
登陆界面: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...