CRC16-ccitt-false 递归解析每一个号码段的值

article/2025/10/31 7:28:04

CRC16-ccitt-false 解析每一个号码段的值

  1. 数据准备
    加密前:6011qwertyuiopa62440007db2a65b0306qrcode043339912211117000000016304
    CRC16-ccitt-false加密后:4023(网上有加密工具类,也有线上计算工具,如下图)
    拼接在一起:6011qwertyuiopa62440007db2a65b0306qrcode0433399122111170000000163044023
    在这里插入图片描述

  2. 我们该如何解析出6011qwertyuiopa62440007db2a65b0306qrcode0419399122111170000000163044023这里面每个号码段对应的值呢?由于键都是两位,值的长度规定不超过99,也是两位,可以通过一个简单的递归解析出每个键对应的值。

/*** crc16-ccitt-false加密工具*/
public class CRC16Util {/*** crc16-ccitt-false加/解密(四字节)** @param s 需要加密的字符串* @return*/public static String crc16(String s) {byte[] bytes = s.getBytes();int crc = crc16(bytes, bytes.length);//结果转换为16进制String result = Integer.toHexString(crc).toUpperCase();if (result.length() != 4) {StringBuffer sb = new StringBuffer("0000");result = sb.replace(4 - result.length(), 4, result).toString();}return result;}/*** crc16-ccitt-false加/解密(四字节)** @param bytes -字节数组* @return*/public static int crc16(byte[] bytes, int len) {int crc = 0xFFFF;for (int j = 0; j < len; j++) {crc = ((crc >>> 8) | (crc << 8)) & 0xffff;crc ^= (bytes[j] & 0xff);// byte to int, trunc signcrc ^= ((crc & 0xff) >> 4);crc ^= (crc << 12) & 0xffff;crc ^= ((crc & 0xFF) << 5) & 0xffff;}crc &= 0xffff;return crc;}/*** 递归按[ID位--值对]拆解二维码** @param s   下一段* @param map 保存ID--值对*/public static void stringSplit(String s, Map<String, String> map) {// 每次进来取前两位 ID位String raw1 = s.substring(0, 2);// 长度位String raw2 = s.substring(2, 4);int value_length = Integer.parseInt(raw2);// 值String value = s.substring(4, 4 + value_length);// 返回ID--值 对map.put(raw1, value);// 下一段String nextStr = s.substring(4 + value_length, s.length());if (!StringUtils.isEmpty(nextStr)) {// 递归stringSplit(nextStr, map);}}/*** @param args 测试*/public static void main(String[] args) {// 源串String s = "6011qwertyuiopa62440007db2a65b0306qrcode041939912211117000000016304";// 计算CRC值System.out.println(crc16(s));// 解析开始// 1、校验CRC串是否合法s = s + crc16(s);  // 拼接在一起System.out.println(s);// 校验crcint length = s.length();String crcStr = s.substring(length - 4); // crc校验码 字符串后4位String raw = s.substring(0, length - 4); // crc源串 字符串去除后4位Boolean checkCrc = crc16(raw).equals(crcStr);System.out.println(checkCrc);// 2、递归解析if (checkCrc) {Map<String, String> map = new HashMap<>();stringSplit(s, map);System.out.println(map);}Map<String, String> map = new HashMap<>();String ss = "0007db2a65b0306qrcode04193991221111700000001";stringSplit(ss, map);System.out.println(map);}
}

Main方法中结果的打印:
4023
6011qwertyuiopa62440007db2a65b0306qrcode0419399122111170000000163044023
true
{60=qwertyuiopa, 62=0007db2a65b0306qrcode04193991221111700000001, 63=4023}

  1. 我们最终得到了源串每个键对应的值:{60=qwertyuiopa, 62=0007db2a65b0306qrcode04333991221111700000001, 63=0D74}。如果还想继续解析出62-00,62-03,62-04对应的值,可以再次调用递归方法stringSplit,得到{00=db2a65b, 03=qrcode, 04=3991221111700000001}

http://chatgpt.dhexx.cn/article/spPWEoHU.shtml

相关文章

文本图像(二值图像)(黑白图像)的压缩算法介绍 CCITT-4 JBIG2

CCITT group3 CCITT group4 JBIG JBIG2 参考&#xff1a; JBIG2标准在数字图书馆中的应用 https://www.docin.com/p-821587404.html

C语言CRC-16 CCITT-FALSE格式校验函数

C语言CRC-16 CCITT-FALSE格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同应用规范…

Eclipse与JDK、JRE的关系

1、首先说明的是&#xff0c;eclipse人家需要jre&#xff0c;而不需要jdk&#xff0c;人家内置的有。你只要在你的电脑上安装一个jre就行。至于jdk&#xff0c;它内置的有2、eclise也不要求你jdk或者jre配置环境变量&#xff0c;毕竟友不用notepad写代码&#xff0c;dos编译执行…

JDK、JRE、JVM三者关系

jdk、jre、jvm三者有什么关系&#xff1f; JDK ☁️ JDK&#xff1a;Java开发工具包&#xff1b; ☁️ JDK中包含了以下内容&#xff1a; ⚡️ Java虚拟机&#xff1a;用于运行Java程序&#xff1b; ⚡️ 核心类库&#xff1a;核心类库中是已经编写好的Java代码&#xff0…

JRE和JDK

JRE和JDK JRE(Java运行环境)Java Runtime Environment 包括Java虚拟机(JVM Java VirtualMachine)和Java程序所需的核心类库等&#xff0c;如果想要运行一个开发好的Java程序&#xff0c;计算机中只需要安装JRE即可。 JRE 核心类库 JVM JDK(Java开发工具包)Java Development…

JDK,JRE,JVM三者间的关系,以及JDK、JRE的主要结构

一、JDK&#xff0c;JRE是什么&#xff1f; 1.JDK 是提供给 Java 开发人员使用的&#xff0c;其中包含了 java 的开发工具&#xff0c;也包括了 JRE。所以安装了JDK&#xff0c;就不用在单独安装JRE了。 2.JRE是包括 Java 虚拟机 (JVM J ava V irtual M achine) 和 Java 程…

【jdk与jre 的关系】

**jdk与jre 的关系** jdk中包含jre和核心开发工具, jre中包含jvm和核心开发类库 jdk中包含jre和核心开发工具, jre中包含jvm和核心开发类库 注: JVM是指Java虚拟机。

JDK、JRE和JVM三者之间关系

JDK、JRE和JVM三者之间关系 很多程序员已经写了很长一段时间java了&#xff0c;依然不明白JDK,JRE,JVM的区别。今天个人总结一下它们三者的关系、区别。 JDK&#xff08;Java Development Kit&#xff09;是针对Java开发员的产品&#xff0c;是整个Java的核心&#xff0c;包括了…

JDK与JRE的安装与配置

这两天为了这个JAVA的编译环境JDK和JRE的配置可花了不少心思&#xff0c;曾还一度把电脑的注册表给误删了&#xff0c;导致电脑重装了系统&#xff0c;这是血的教训。我买了一本学习JAVA的书&#xff0c;看了里面的视频终于把编译环境给配置好了&#xff0c;其实非常简单。 开始…

jdk与jre

jdk与jre jdk1.8目录jdk1.8下的bin目录jdk1.8下的jre目录jdk1.8下的lib目录 jdk1.8目录 安装好的JDK路径下目录如下&#xff1a;有bin、db、include、jre、lib、COPYRIGHT、javafx-src.zip、LICENSE、README.html、release、src.zip、THIRDPARTYLICENSEREADME.txt、THIRDPARTY…

【jdk和jre】

JRE和JDK JRE (Java Runtime Environment)\n是Java程序的运行时环境&#xff0c;包含JVM和运行时所需要的核心类库。 我们想要运行一个已有的Java程序&#xff0c; 那么只需安装JRE即可。 JDK (Java Development Kit)\n是Java程序开发工具包&#xff0c;包含JRE和开发人员使用…

jdk没有jre的解决方法

jdk11以上没有jre的解决方法 小白篇 安装的jdk没有jre(JDK11以上版本)解决方法方法一&#xff1a;步骤1&#xff1a;步骤2&#xff1a; 注意:方法二&#xff1a;步骤1&#xff1a;步骤2&#xff1a; 值得注意的是&#xff1a;1.2. 安装的jdk没有jre(JDK11以上版本) 我猜你安装…

jdk、jre、jvm分别是什么?有什么联系?

目录 介绍 JDK和JRE JRE和JVM 介绍 JDK&#xff1a;是Java Development Kit的缩写&#xff0c;是Java的开发工具包&#xff0c;JDK是整个JAVA的核心。它提供了编译、运行Java程序所需的各种工具和资源。有了它&#xff0c;Java开发者就可以编译和运行自己的Java程序。它包含…

JDK、JRE、JVM 之间的关系

总结&#xff1a; 关系&#xff1a;JDK包含JRE JRE包含JVM JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual M…

JDK、JRE和JVM之间的关系

作为一个Java开发者&#xff0c;只会用Java&#xff0c;却不知什么是JDK、JRE和JVM是什么&#xff0c;以及他们之间有什么联系。本文总结了JDK&#xff0c;JRE&#xff0c;JVM三者的关系与区别。 JDK、JRE和JVM之间的关系 一、JDK二、JRE三、JVM四、三者的联系五、三者的区别六…

Java基础 — JDK和JRE的区别和环境变量配置

1、JDK和JRE区别 JDK&#xff1a;java 程序开发工具包&#xff0c;包括编译器&#xff08;javac.exe&#xff09;、开发工具&#xff08;javadoc.exe、jar.exe、keytool.exe、jconsole.exe&#xff09;和更多的类库&#xff08;如tools.jar&#xff09;等。JRE&#xff1a;jav…

linux df和du命令

df&#xff08;disk free&#xff09;命令用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。Linux du &#xff08;英文全拼&#xff1a;disk usage&#xff09;命令用于显示目录或文件的大小。 加上-h以可读性更强的方式显示文件大小 由此可见&#xff0c;一个是对于…

Linux命令详解之du命令

功能&#xff1a;可以用于查看每个文件的磁盘用量&#xff0c;目录则取总用量 格式&#xff1a;du 【选项】【文件或目录】 主要使用参数&#xff1a; -a 显示所有文件的大小 -h 以人类可读的方式查看…

十进制小数转二进制

十进制小数转换成二进制小数采用"乘2取整&#xff0c;顺序排列"法。以0.875为例&#xff0c;具体做法是&#xff1a; 一、取整运算 1、用2乘十进制小数&#xff0c;可以得到积&#xff1a;2*0.8751.75&#xff1b; 2、将积的整数部分1取出&#xff0c;再用2乘余下…

小数的二进制和十进制之间的转换

0.125(十进制) 依次 2 取小数点左边第一个数&#xff0c;将取得的数按顺序排列在小数点右侧&#xff0c;例子如下&#xff1a; 0.125 2 0.25 0.25 2 0.5 0.5 2 1.0 0.125&#xff08;十进制&#xff09;——> 0.001&#xff08;二进制&#xff09; 0.001(二进制…