10 HXCodec

前言

这个主要是提供了日常的相关 编码解码体系 的工具包, 依赖于fastjson 和 netty-all

里面主要包含了一些 摘要的生成, base64编码解码, ByteBuf操作api, Des编码解码, 文件操作, 十六进制操作, io操作, md5操作, 属性操作, rsa操作, socket操作

对象 序列化为字节序列, 字节序列 反序列化为对象

https://github.com/970655147/HXCodec

这里核心关注的是 对象 和 字节序列 的相互转换, 以下为 基础类型的转换, 数组的转换, 集合的转换, 字符串的转换, 实体的转换, Map 的转换 等等

BYTE 为有符号单字节

UNSIGNED_BYTE 为无符号单字节

WORD 为有符号双字节

UNSIGNED_ WORD 为无符号双字节

DWORD 为有符号四字节

QWORD 为有符号八字节

*_ARRAY 为对应类型的数组

*_COLLECTION 为对应类型的集合

*_WITH_LEN : 表示在编码集合之前会先编码长度

*_WITH_ELE_LEN : 指定元素数量, 如果数量不够, 补充 padding 字节到目标字节数 

*_WITH_FIXED_LEN : 指定编码之后的长度, 如果数量不够, 补充 padding 字节到目标字节数 

*_WITH_EXACTLY_LEN : 指定元素数量, 并确保元素数量 和 配置数量一致

B8421 相关, 指的是将目标字符串按照 B8421 进行编码 

CHARSET_ENCODING 相关指的是 字符串按照给定的编码集进行编码解码

GENERIC_BEAN 相关指的是, 按照给定的实体的字段属性配置 构建一个 BeanCodec 来处理当前实体的 编码解码

GENERIC_MAP 相关指的是, 按照给定的key, value属性配置 构建一个 MapCodec 来处理当前实体的 编码解码

// ------------------------------------------ basic types ------------------------------------------

BYTE,
UNSIGNED_BYTE,
WORD,
UNSIGNED_WORD,
DWORD,
QWORD,

// ------------------------------------------ array types ------------------------------------------

BYTE_ARRAY,
UNSIGNED_BYTE_ARRAY,
WORD_ARRAY,
UNSIGNED_WORD_ARRAY,
DWORD_ARRAY,
QWORD_ARRAY,
GENERIC_BEAN_ARRAY,

BYTE_ARRAY_WITH_LEN,
UNSIGNED_BYTE_ARRAY_WITH_LEN,
WORD_ARRAY_WITH_LEN,
UNSIGNED_WORD_ARRAY_WITH_LEN,
DWORD_ARRAY_WITH_LEN,
QWORD_ARRAY_WITH_LEN,
GENERIC_BEAN_ARRAY_WITH_LEN,

BYTE_ARRAY_WITH_ELE_LEN,
UNSIGNED_BYTE_ARRAY_WITH_ELE_LEN,
WORD_ARRAY_WITH_ELE_LEN,
UNSIGNED_WORD_ARRAY_WITH_ELE_LEN,
DWORD_ARRAY_WITH_ELE_LEN,
QWORD_ARRAY_WITH_ELE_LEN,
GENERIC_BEAN_ARRAY_WITH_ELE_LEN,

BYTE_ARRAY_WITH_FIXED_LEN,
UNSIGNED_BYTE_ARRAY_WITH_FIXED_LEN,
WORD_ARRAY_WITH_FIXED_LEN,
UNSIGNED_WORD_ARRAY_WITH_FIXED_LEN,
DWORD_ARRAY_WITH_FIXED_LEN,
QWORD_ARRAY_WITH_FIXED_LEN,
GENERIC_BEAN_ARRAY_WITH_FIXED_LEN,

BYTE_ARRAY_WITH_EXACTLY_LEN,
UNSIGNED_BYTE_ARRAY_WITH_EXACTLY_LEN,
WORD_ARRAY_WITH_EXACTLY_LEN,
UNSIGNED_WORD_ARRAY_WITH_EXACTLY_LEN,
DWORD_ARRAY_WITH_EXACTLY_LEN,
QWORD_ARRAY_WITH_EXACTLY_LEN,
GENERIC_BEAN_ARRAY_WITH_EXACTLY_LEN,

// ------------------------------------------ collection types ------------------------------------------

BYTE_COLLECTION,
UNSIGNED_BYTE_COLLECTION,
WORD_COLLECTION,
UNSIGNED_WORD_COLLECTION,
DWORD_COLLECTION,
QWORD_COLLECTION,
GENERIC_BEAN_COLLECTION,
SCHEMA_REGISTRY_BASED_COLLECTION,

BYTE_COLLECTION_WITH_LEN,
UNSIGNED_BYTE_COLLECTION_WITH_LEN,
WORD_COLLECTION_WITH_LEN,
UNSIGNED_WORD_COLLECTION_WITH_LEN,
DWORD_COLLECTION_WITH_LEN,
QWORD_COLLECTION_WITH_LEN,
GENERIC_BEAN_COLLECTION_WITH_LEN,
SCHEMA_REGISTRY_BASED_COLLECTION_WITH_LEN,

BYTE_COLLECTION_WITH_ELE_LEN,
UNSIGNED_BYTE_COLLECTION_WITH_ELE_LEN,
WORD_COLLECTION_WITH_ELE_LEN,
UNSIGNED_WORD_COLLECTION_WITH_ELE_LEN,
DWORD_COLLECTION_WITH_ELE_LEN,
QWORD_COLLECTION_WITH_ELE_LEN,
GENERIC_BEAN_COLLECTION_WITH_ELE_LEN,

BYTE_COLLECTION_WITH_FIXED_LEN,
UNSIGNED_BYTE_COLLECTION_WITH_FIXED_LEN,
WORD_COLLECTION_WITH_FIXED_LEN,
UNSIGNED_WORD_COLLECTION_WITH_FIXED_LEN,
DWORD_COLLECTION_WITH_FIXED_LEN,
QWORD_COLLECTION_WITH_FIXED_LEN,
GENERIC_BEAN_COLLECTION_WITH_FIXED_LEN,

BYTE_COLLECTION_WITH_EXACTLY_LEN,
UNSIGNED_BYTE_COLLECTION_WITH_EXACTLY_LEN,
WORD_COLLECTION_WITH_EXACTLY_LEN,
UNSIGNED_WORD_COLLECTION_WITH_EXACTLY_LEN,
DWORD_COLLECTION_WITH_EXACTLY_LEN,
QWORD_COLLECTION_WITH_EXACTLY_LEN,
GENERIC_BEAN_COLLECTION_WITH_EXACTLY_LEN,
SCHEMA_REGISTRY_BASED_COLLECTION_WITH_EXACTLY_LEN,

// ------------------------------------------ string types ------------------------------------------

BCD_8421_STRING,
BCD_8421_STRING_WITH_LEN,
BCD_8421_STRING_WITH_FIXED_LEN,
BCD_8421_STRING_WITH_EXACTLY_LEN,
BCD_8421_BIG_DECIMAL_WITH_ONE_BYTE_LEN,
CHARSET_ENCODING_STRING,
CHARSET_ENCODING_WITH_LEN_STRING,
CHARSET_ENCODING_WITH_FIXED_LEN_STRING,

// ------------------------------------------ entity types ------------------------------------------

GENERIC_BEAN,
CUSTOM_BEAN,

// ------------------------------------------ map types ------------------------------------------

GENERIC_MAP,
GENERIC_MAP_WITH_LEN,
GENERIC_MAP_WITH_EXACTLY_LEN,
SCHEMA_REGISTRY_BASED_MAP,
SCHEMA_REGISTRY_BASED_MAP_WITH_LEN,
SCHEMA_REGISTRY_BASED_MAP_WITH_EXACTLY_LEN,

// ------------------------------------------ other types ------------------------------------------

PADDING_BYTE,
PADDING_BYTES,

测试用例

一个简单的测试用例如下 

/*** Test14GenericBeanCodec** @author Jerry.X.He* @version 1.0* @date 2021/9/28 14:31*/
@FixMethodOrder(value = MethodSorters.NAME_ASCENDING)
public class Test14GenericBeanCodec extends Test00BaseTests {@Testpublic void test01UpConnectReq() {GenericBeanSchema<UpConnectReq> beanSchema = new GenericBeanSchema<>(UpConnectReq.class, 2019);GenericBeanCodec<UpConnectReq> codec = new GenericBeanCodec<>(beanSchema);UpConnectReq entity = new UpConnectReq();entity.setDummyField("dummyField");entity.setUserid(0x1234);entity.setPassword("pass");entity.setDownLinkIp("127.0.0.2");entity.setDownLinkPort(0x7788);entity.setMsgGnsscenterid(0x1111);ByteBuf encodedBuf = Unpooled.buffer(128);codec.encode(entity, encodedBuf);String encodedBufHexStr = ByteBufUtil.hexDump(encodedBuf);UpConnectReq decodedEntity = codec.decode(encodedBuf);LOGGER.info(" encodedBufHexStr : " + encodedBufHexStr);AssertUtils.state(encodedBufHexStr.equals("07070707070707070707000012347061737300000000000011113132372e302e302e3200000000000000000000000000000000000000000000007788"), " unexpected value ");AssertUtils.state(entity.getUserid().equals(decodedEntity.getUserid()), " unexpected value ");AssertUtils.state(entity.getPassword().equals(decodedEntity.getPassword()), " unexpected value ");AssertUtils.state(entity.getDownLinkIp().equals(decodedEntity.getDownLinkIp()), " unexpected value ");AssertUtils.state(entity.getDownLinkPort().equals(decodedEntity.getDownLinkPort()), " unexpected value ");AssertUtils.state(entity.getMsgGnsscenterid().equals(decodedEntity.getMsgGnsscenterid()), " unexpected value ");}@Testpublic void test02UpExgMsgRealLocation() {GenericBeanSchema<Jt809Header> headerBeanSchema = new GenericBeanSchema<>(Jt809Header.class, 2019);GenericBeanCodec<Jt809Header> headerCodec = new GenericBeanCodec<>(headerBeanSchema);GenericBeanSchema<UpExgMsgRealLocation> entityBeanSchema = new GenericBeanSchema<>(UpExgMsgRealLocation.class, 2019);GenericBeanCodec<UpExgMsgRealLocation> entityCodec = new GenericBeanCodec<>(entityBeanSchema);GenericBeanSchema<GnssDataItem> gnssDataItemBeanSchema = new GenericBeanSchema<>(GnssDataItem.class, 2019);GenericBeanCodec<GnssDataItem> gnssDataItemCodec = new GenericBeanCodec<>(gnssDataItemBeanSchema);Jt809Header header = new Jt809Header();header.setMsgLength(98);header.setMsgSn(0x1);header.setMsgId(0x2);header.setMsgGNSSCenterId(0x3);header.setVersionFlag(new Integer[]{5, 0, 0});header.setEncryptFlag(0x0);header.setEncryptKey(0x5);header.setTime(0x6);header.setMsgId(0x4100);UpExgMsgRealLocation entity = new UpExgMsgRealLocation();entity.setVehicleNo("1");entity.setVehicleColor(0x01);GnssDataItem gnssDataItem = new GnssDataItem(3, new Integer[]{0x1, 0x02, 0x03, 0x04}, new Integer[]{0x1, 0x02, 0x03},4, 5, 6, 7, 8, 9, 10, 11, 12);entity.setGnssDataItem(gnssDataItem);entity.setSubDataType(0x4102);entity.setSubDataLength(gnssDataItemCodec.length());ByteBuf encodedBuf = Unpooled.buffer(128);headerCodec.encode(header, encodedBuf);entityCodec.encode(entity, encodedBuf);String encodedBufHexStr = ByteBufUtil.hexDump(encodedBuf);Jt809Header decodedHeader = headerCodec.decode(encodedBuf);UpExgMsgRealLocation decodedEntity = entityCodec.decode(encodedBuf);LOGGER.info(" encodedBufHexStr : " + encodedBufHexStr);AssertUtils.state(encodedBufHexStr.equals("000000620000000141000000000305000000000000050000000000000006310000000000000000000000000000000000000000014102000000240301020304010203000000040000000500060007000000080009000a0000000b0000000c"), " unexpected value ");AssertUtils.state(header.getMsgLength().equals(decodedHeader.getMsgLength()), " unexpected value ");AssertUtils.state(header.getMsgSn().equals(decodedHeader.getMsgSn()), " unexpected value ");AssertUtils.state(header.getMsgId().equals(decodedHeader.getMsgId()), " unexpected value ");AssertUtils.state(header.getMsgGNSSCenterId().equals(decodedHeader.getMsgGNSSCenterId()), " unexpected value ");AssertUtils.state(header.getEncryptFlag().equals(decodedHeader.getEncryptFlag()), " unexpected value ");AssertUtils.state(header.getEncryptKey().equals(decodedHeader.getEncryptKey()), " unexpected value ");AssertUtils.state(entity.getVehicleNo().equals(decodedEntity.getVehicleNo()), " unexpected value ");AssertUtils.state(entity.getVehicleColor().equals(decodedEntity.getVehicleColor()), " unexpected value ");AssertUtils.state(entity.getSubDataType().equals(decodedEntity.getSubDataType()), " unexpected value ");AssertUtils.state(entity.getSubDataLength().equals(decodedEntity.getSubDataLength()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getEncrypt().equals(decodedEntity.getGnssDataItem().getEncrypt()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getLon().equals(decodedEntity.getGnssDataItem().getLon()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getLat().equals(decodedEntity.getGnssDataItem().getLat()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getVec1().equals(decodedEntity.getGnssDataItem().getVec1()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getVec2().equals(decodedEntity.getGnssDataItem().getVec2()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getVec3().equals(decodedEntity.getGnssDataItem().getVec3()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getDirection().equals(decodedEntity.getGnssDataItem().getDirection()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getAltitude().equals(decodedEntity.getGnssDataItem().getAltitude()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getState().equals(decodedEntity.getGnssDataItem().getState()), " unexpected value ");AssertUtils.state(entity.getGnssDataItem().getAlarm().equals(decodedEntity.getGnssDataItem().getAlarm()), " unexpected value ");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qlib从入门到精通

前面谈到了简单的一个示例代码&#xff0c;实际上里面的策略源码和模型回测源码都需要好好了解&#xff0c;他这个回测系统和我之前用到的回测策略代码有不一样的地方&#xff0c;作为一个量化策略攻城狮&#xff0c;掌握源码是基本的技能。 Qlib内置了A股、美股两个市场的历史…

如何开发一个google插件(二)

前言 在上一篇文章如何开发一个google插件(一)里主要介绍了google插件的基本结构。 在这篇文章中主要结合reactwebpack进行一个代码演示&#xff0c;源码地址&#xff1a;源码地址 下载源码后打开浏览器的扩展程序管理->加载已解压的扩展程序&#xff0c;即可调试插件 此…

在线客服选择要点分析:如何挑选适合您需求的客服解决方案

选择一款好的在线客服系统&#xff0c;可以帮助企业多渠道的触达客户&#xff0c;与客户进行高效的沟通&#xff0c;最终达成转化的目的。 市面上现在成熟的客服系统产品有很多&#xff0c;企业在进行选择时要考虑以下几点&#xff1a; 1、企业需求 市场上的客服系统产品主要…

10、复制

复制概述 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上&#xff0c;备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。 Mysql 支持两种复制方式&#xff1a;基于行的复制和基于语句…

向表达式添加括号后的最小结果

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 给你一个下标从 0 开始的字符串 expression &#xff0c;格式为 “num1num2” &#xff0c;…

ArkTS - 组件生命周期

一、先说下自定义组件 在arkTs中&#xff0c;自定义组件分为两种&#xff08;我的总结&#xff09;&#xff1a; 一种是&#xff1a;根组件&#xff0c;就是被装饰器Entry装饰的入口组件&#xff0c;这也是自定义组件(父组件)。 另一种是&#xff1a;没有被Entry装饰的自定义…

跟我学c++中级篇——再谈C++20中的协程

一、协程 在前面分析过协程是什么&#xff0c;也对c20中的协程的应用进行了举例说明。所以这次重点分析一下c20中的整体构成及应用的方式。等明白了协程是如何动作的&#xff0c;各种情况下如下何处理相关的事件&#xff0c;那么在以后写协程时就不会死搬硬套了。 二、整体说…

分布式存储考点梳理 + 高频面试题

欢迎来到分布式存储模环节&#xff0c;本文我将和你一起梳理面试中分布式系统的数据库的高频考点&#xff0c;做到温故知新。 面试中如何考察分布式存储 广义的分布式存储根据不同的应用领域&#xff0c;划分为以下的类别&#xff1a; 分布式协同系统 分布式文件系统 分布式…

Xline command 去重机制(一)—— RIFL 介绍

为什么要对 command 去重&#xff1f; 在一个接收外部 command 的系统中&#xff0c;通常一个 command 至少要执行一次&#xff0c;我们称其为 at-least-once semantics。如果一个 command 执行失败&#xff0c;系统内部经常会实现一套重试结构来尝试恢复这个问题&#xff0c;…

HTML 基础

文章目录 01-标签语法标签结构 03-HTML骨架04-标签的关系05-注释06-标题标签07-段落标签08-换行和水平线09-文本格式化标签10-图像标签图像属性 11-路径相对路径绝对路径 12-超链接标签13-音频14-视频 01-标签语法 HTML 超文本标记语言——HyperText Markup Language。 超文本…

【分布式配置中心】聊聊Apollo的安装与具体配置变更的原理

【管理设计篇】聊聊分布式配置中心 之前就写过一篇文章&#xff0c;介绍配置中心&#xff0c;但是也只是简单描述了下配置中心的设计点。本篇从apollo的安装到部署架构到核心原理进一步解读&#xff0c;大概看了下apollo的原理&#xff0c;感觉没有必要深究&#xff0c;所以就…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷③

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 模块…

2024黑龙江省职业院校技能大赛暨国赛选拔赛应用软件系统开发赛项(高职组)赛题第1套

2024黑龙江省职业院校技能大赛暨国赛选拔赛 应用软件系统开发赛项&#xff08;高职组&#xff09; 赛题第1套 竞赛说明 目录 需要竞赛源码资料可私信博主&#xff01; 竞赛说明 模块一&#xff1a;系统需求分析 任务1&#xff1a;制造执行MES—质量管理—质检标准&#xff…

FreeRTOS学习--49讲 事件标志位

事件标志位&#xff1a; 用一个bit位来表示事件是否发生&#xff0c;只有0(未发生)和1(已发生)两种状态 事件组&#xff1a;事件组是一组事件标志的集合&#xff0c;一组事件组包含了EventBites_t数据类型的变量&#xff0c;该变量高8未不能作为事件标志&#xff0c;用于存储控…

以一种访问权限不允许的方式做了一个访问套接字的尝试

python -m http.server 启动失败 原因是端口被占用&#xff0c;但是使用 netstat -ano|findstr 8000 却没发现占用&#xff0c;最后发现是hyper-v占用了&#xff0c;要给容器使用。 使用命令 netsh int ipv4 show dynamicport tcp可以查看TCP 动态端口范围的情况。 netsh int…

人机对话--关于意识机器

人机对话——关于意识机器 这段内容是我和《通义千问》的对话。这本身展示的是人工智能的效果&#xff0c;同时这里面的内容也有人工智能相关&#xff0c;与各位分享。 我&#xff1a;阿尼尔赛斯 《意识机器》这本书写的是什么&#xff1f; 通义千问&#xff1a; 阿尼尔赛斯…

❀My排序算法学习之冒泡排序❀

目录 冒泡排序(Bubble Sort):) 一、定义 二、算法原理 三、算法分析 时间复杂度 算法稳定性 算法描述 C语言 C++ 算法比较 插入排序 选择排序 快速排序 归并排序 冒泡排序(Bubble Sort):) 一、定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单…

【北亚数据恢复】mysql表被truncate,表数据被delete的数据恢复案例

云服务器数据恢复环境&#xff1a; 华为ECS云服务器&#xff0c;linux操作系统&#xff0c;mysql数据库&#xff08;innodb引擎&#xff09;。作为网站服务器使用。 云服务器故障&#xff1a; 在执行mysql数据库版本更新测试时&#xff0c;误将本应该在测试库上执行的sql脚本执…

渗透测试计划模板

引言 1.1 目的 1.2 范围 1.3 参考文档 1.4 术语和定义 系统概述 2.1 系统描述 2.2 系统架构 2.3 技术栈 2.4 相关方 目标与风险评估 3.1 目标设定 3.2 风险评估 3.3 风险优先级排序 测试方法与工具 4.1 黑盒测试方法 4.2 白盒测试方法 4.3 灰盒测试方法 4.4 常用渗透测试工具…

亚马逊云科技Amazon Q,一款基于生成式人工智能的新型助手

近日&#xff0c;亚马逊云科技宣布推出Amazon Q&#xff0c;这是一款基于生成式人工智能&#xff08;AI&#xff09;的新型助手&#xff0c;专为辅助工作而设计&#xff0c;可以根据您的业务量身定制。通过连接到公司的信息存储库、代码、数据和企业系统&#xff0c;可以使用Am…