当前位置:   article > 正文

华为机试:TLV解析Ⅰ_tlv 数据接口

tlv 数据接口

【编程题目 | 100分】TLV解析Ⅰ [ 100 / 中等 ]

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

示例 1 :

输入
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
  • 1
  • 2
输出
32 33
  • 1
说明
  • 需要解析的信元的Tag是31,从码流的起始处开始匹配,
  • Tag为32的信元长度为1(01 00,小端序表示为1);
  • 第二个信元的Tag是90,其长度为2;
  • 第三个信元的Tag是30,其长度为3;
  • 第四个信元的Tag是31,其长度为2(02 00),所以返回长度后面的两个字节即可,即32 33。
思路分析

字符串转整数时,可以直接转为对应进制的整数。注意是小端,小的在后面。

参考代码:

Java代码实现:

import java.util.Scanner;

public class TLVAnalyize1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String tag = in.nextLine();
        String[] tlv = in.nextLine().split(" ");
        for (int i = 0; i < tlv.length; ) {
            int length = Integer.parseInt(tlv[i + 2] + tlv[i + 1], 16);  // 将字符串的Length转为16进制,小端,需要反过来
            if (tag.equals(tlv[i])) {
                StringBuilder sb = new StringBuilder();
                for (int j = i + 3; j < i + 3 + length; j++) {
                    sb.append(tlv[j]).append(" ");
                }
                System.out.println(sb.toString());
                break;
            } else {
                i += length + 3;
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/705517
推荐阅读
相关标签
  

闽ICP备14008679号