华为od机试题练习。TVL编码

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

    public  static void main(String[] args) {
        //输入是一个字符串,第一行表示信元的tag
        Scanner in = new Scanner(System.in);
        System.out.println("请输入");
        boolean hasNext = in.hasNext();
        String sign = null;
        String code = null;
        //取输入
        if (hasNext){
             sign = in.nextLine();
        }
        code = in.nextLine();
        String[] codes = code.split(" ");
        boolean isSign = false;
        int index = 0;
        while (index < codes.length && !isSign){
            if (sign.equals(codes[index])){
                isSign = true;
            }
            //取两个字节获取对应的value的长度
            int length = transforInt(codes[index + 1] + codes[index + 2]);
            index = index +3 ;
            if (isSign){
                for (int i = index; i < index+length; i++) {
                    System.out.print(codes[i]+" ");
                }
            }
            index = index+length;
        }
    }

    static int transforInt(String s){
        //传入的小端序的四位0100
        char[] chars = s.toCharArray();
        int[] numnbers = new int[chars.length];
        for (int i = 0; i < chars.length; i++) {
            if (chars[i]>=48&&chars[i]<65){
                numnbers[i] = chars[i]-48;;
            }else{
                numnbers[i]=(chars[i]-65+10);
            }
        }
        return numnbers[0]*16 +numnbers[1]+numnbers[2]*16*16*16+numnbers[3]*16*16;
    }


原文链接:https://blog.csdn.net/weixin_44052055/article/details/123903244

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值