华为OD机试之TLV解析Ⅰ(Java源码)

news/2024/7/20 18:34:05 标签: java, 开发语言, 华为OD

TLV解析Ⅰ

题目描述

TLV编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。
码流以某信元的Tag开头,Tag固定占一个字节,Length固定占两个字节,字节序为小端序。
现给定TLV格式编码的码流,以及需要解码的信元Tag,请输出该信元的Value。
输入码流的16进制字符中,不包括小写字母,且要求输出的16进制字符串中也不要包含小写字母;码流字符串的最大长度不超过50000个字节。

输入描述

输入的第一行为一个字符串,表示待解码信元的Tag;
输入的第二行为一个字符串,表示待解码的16进制码流,字节之间用空格分隔。

输出描述

输出一个字符串,表示待解码信元以16进制表示的Value。

输入输出说明
31
32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC
32 33需要解析的信元的Tag是31,
从码流的起始处开始匹配,
第一个信元的Tag是32,信元长度为1(01 00,小端序表示为1);
第二个信元的Tag是90,其长度为2;
第三个信元的Tag是30,其长度为3;
第四个信元的Tag是31,其长度为2(02 00),
所以返回长度后面的两个字节即可,即32 33。

源码和解析
解析:

这个题首先要理解题目还是挺难的。小编拿到这个题读了三五遍还是理解不了题目要我们做个啥。后面也是参考别人的博客理解的题意。
首先要理解的一个概念就是 小端序
字节的排列方式有两个通用规则:

大端序Big-Endian: 将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。
小端序Little-Endian: 将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。在这里插入图片描述
也就是说 小端序的排列方式 Len的两个字节需要交换顺序才能得到值的长度
比如02 00 = 其长度表示应该为 0002 也就是2位长度
示例中的码流可以做如下解析:
在这里插入图片描述
也就是每个tag对应的值 长度是变化的。我们需要依据tag后的两个字节长度推出后面的值

示例代码:

java">public class T14 {
	public static void main(String[] args) {
		String objTag="31";
		String input="32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC";
		String[] chArr = input.split(" ");
		for(int i=0;i<chArr.length;){
			String tag=chArr[i];
			int len=Integer.parseInt(chArr[i+2]+chArr[i+1]);// 小端序排列 还原长度时要交换位置
			StringBuilder value=new StringBuilder();
			i+=2;// tag 移动完
			for(int j=1;j<=len;j++){
				value.append(chArr[i+j]+" ");
				i++;//移动值
			}
			if(tag.equals(objTag)){
				System.out.println(value);
				break;
			}
			if(i<=(chArr.length-1))i++;// 移动tag
		}
	}
}


http://www.niftyadmin.cn/n/347508.html

相关文章

操作系统原理 —— 什么是管程? 管程的概念以及作用(十六)

上一个章节中&#xff0c;我们讲了什么是信号量&#xff0c;如何用信号量来实现进程之间的同步、互斥。 但是吧&#xff0c;用信号量来实现的话&#xff0c;好麻烦哟&#xff0c;在各个进程之间都要大量的 PV 操作&#xff0c;而且操作不当一不小心就死锁了&#xff0c;为了锻…

牵手成都大运会背后,转转为循环经济运营创新带来新思路

转转集团与成都大运会达成合作。 5月18日&#xff0c;成都第31届世界大学生夏季运动会&#xff08;简称“成都大运会”&#xff09;与转转集团正式签约&#xff0c;转转集团成为成都大运会二手循环服务类官方供应商。 一、成都大运会&#xff1a;创新的的国际体育赛事 据了解…

springboot的一些延伸问题

Spring Boot项目如何热部署&#xff1f; 这可以使用 DEV 工具来实现。通过这种依赖关系&#xff0c;您可以节省任何更改&#xff0c;嵌入式tomcat 将重新启动。 Spring Boot 有一个开发工具&#xff08;DevTools&#xff09;模块&#xff0c;它有助于提高开发人员的生产力。…

【Python从入门到人工智能】14个必会的Python内置函数(9)——实现当前是今年的第几天,本周是今年的第几周(数据格式化处理综合应用)

人生就是一场大考,由无数次的小考汇聚而成,不同阶段有不同的考验,每一次的考验都是对自我的一次超越,每一次的考验都是对人生的一次总结。 我们在这其中也许会经历失败挫折(大概率会吧),我们也许会经历风雨漂泊,但只要最初的梦想不改,明天依旧会更好。 🎯作者主页: …

effective c++ 18 让接口容易被正确使用, 不易被误用

effective c 18 让接口容易被正确使用&#xff0c; 不易被误用 在本节中作者建议大家在写代码的时候要提供的接口需要拥有正确性和易用性。 写代码时你可能根据第一感觉就写出了一个接口&#xff0c;这个时候你可能需要再思考思考这个接口是否好用&#xff0c; 是否可能被误用…

Android Radio实战——调频/调幅(十二)

1、方法封装 private final Object mLock = new Object(); private RadioTuner mRadioTuner;/*** 向上调频/调辐*/ public void setRadioSeekUp() {synchronized (mLock) {Log.i(TAG, "CONTROL_ACTION_SEEKUP mLock");if (mRadioTuner == null) {mRadioTuner = open…

反射技术

一、获取Class对象 方式一&#xff1a;类名.class // 方式一&#xff1a;类名.classClass<Student> studentClass Student.class;System.out.println(studentClass);方式二&#xff1a;static Class forName(String fullNameWithPackage) 需要注意的是&#xff0c;for…

ActiveMq消息队列

ActiveMq是一种开源的java程序&#xff0c;支持Java消息服务(JMS) 1.1 版本 一、持久化机制 1、KahaDB&#xff1a;5.4及之后版本&#xff0c;默认使用日志文件 activemq.xml默认使用KahaDB持久化存储&#xff0c;默认配置安装路径data目录下 <persistenceAdapter> …