TLV解码 - 华为OD统一考试(E卷)

news2024/9/23 16:46:36

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

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

输出:
32 33

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

题解

题目类型:

该问题属于典型的字符串解析与编码解码问题。具体地说,它涉及对TLV编码格式的解析,利用小端序字节进行长度信息的转换,目标是从给定码流中提取出与目标Tag匹配的信元的Value值。这类问题可以归类为字节序处理与字符串匹配

解题思路:

  1. TLV格式解析:TLV编码由Tag、Length、Value组成:
    • Tag:信元标识符,固定占1个字节。
    • Length:信元长度,固定占2个字节(小端序存储)。
    • Value:信元值,长度由Length字段表示。
  2. 小端序处理:Length字段为小端序存储,需要将两个字节颠倒顺序再进行长度计算,即Length = bytes[idx+2] + bytes[idx+1]
  3. 匹配流程
    • 从码流的开头开始遍历Tag,如果找到与给定Tag相同的信元,则解析其后面的Length字节,计算Value部分并输出。
    • 每个信元的解析长度为:Tag(1字节) + Length(2字节) + Value(Length指定的字节数)
  4. 遍历过程
    • 逐步解析Tag、Length和Value,直到找到与给定Tag匹配的信元,输出其对应的Value。

时间复杂度:每个信元的解析时间是O(1),遍历码流的整体复杂度为O(n),其中n是码流的长度。由于每次遍历都会跳过已解析的信元,因此整体时间复杂度是O(n)。

空间复杂度:除了输入数据外,额外使用的空间主要是存储结果的List或数组,空间复杂度为O(n)。

Java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        // 待解码信元的Tag
        String tag = in.next();

        // 码流字符串
        List<String> bytes = new ArrayList<>();
        while (in.hasNext()) {
            bytes.add(in.next());
        }

        List<String> result = new ArrayList<>();
        int idx = 0, n = bytes.size();
        while (idx < n) {
            String t = bytes.get(idx);
            // 将 16 进制字符串转成 10 进制整数
            int len = Integer.parseInt(bytes.get(idx + 2) + bytes.get(idx + 1), 16);

            // 待接码的元Tag的信元值解析存入 result 中
            if (t.equals(tag)) {
                result = bytes.subList(idx + 3, idx + 3 + len);
                break;
            }
            idx += len + 3;
        }

        // 输出结果
        System.out.println(String.join(" ", result));
    }
}

Python

# 待解码信元的Tag
tag = input()

# 码流字符串
bytes = input().split()

result = []
idx, n = 0, len(bytes)
while idx < n:
    t = bytes[idx]
    # 将 16 进制字符串转成 10 进制整数
    length_hex = bytes[idx + 2] + bytes[idx + 1]
    length = int(length_hex, 16)

    # 待接码的元Tag的信元值解析存入 result 中
    if t == tag:
        result = bytes[idx + 3:idx + 3 + length]
        break
    idx += length + 3

# 输出结果
print(" ".join(result))

C++

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    // 待解码信元的Tag
    string tag;
    cin >> tag;

    // 码流字符串
    vector<string> bytes;
    string byte;
    while (cin >> byte) {
        bytes.push_back(byte);
    }

    vector<string> result;
    int idx = 0, n = bytes.size();
    while (idx < n) {
        string t = bytes[idx];
        // 将 16 进制字符串转成 10 进制整数
        int len = stoi(bytes[idx + 2] + bytes[idx + 1], nullptr, 16);

        // 待接码的元Tag的信元值解析存入 result 中
        if (t == tag) {
            result.assign(bytes.begin() + idx + 3, bytes.begin() + idx + 3 + len);
            break;
        }
        idx += len + 3;
    }

    // 输出结果
    for (int i = 0; i < result.size(); i++) {
        if (i != 0) cout << " ";
        cout << result[i];
    }
    cout << endl;

    return 0;
}

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

Zotero(7.0.5)+123云盘同步空间+Z-library=无限存储文献pdf/epub电子书等资料

选择123云盘作为存储介质的原因 原因1&#xff1a; zotero个人免费空间大小&#xff1a;300M&#xff0c;如果zotero云端也保存文献pdf资料则远远不够 原因2&#xff1a; 百度网盘同步文件空间大小&#xff1a;1G123云盘同步文件空间大小&#xff1a;10G 第一台电脑实施步骤…

微服务--Gateway网关

在微服务架构中&#xff0c;Gateway&#xff08;网关&#xff09;是一个至关重要的组件&#xff0c;它扮演着多种关键角色&#xff0c;包括路由、负载均衡、安全控制、监控和日志记录等。 Gateway网关的作用 统一访问入口&#xff1a; Gateway作为微服务的统一入口&#xff0c…

DNF Decouple and Feedback Network for Seeing in the Dark

DNF: Decouple and Feedback Network for Seeing in the Dark 在深度学习领域&#xff0c;尤其是在低光照图像增强的应用中&#xff0c;RAW数据的独特属性展现出了巨大的潜力。然而&#xff0c;现有架构在单阶段和多阶段方法中都存在性能瓶颈。单阶段方法由于域歧义&#xff0c…

计算机网络 --- Socket 编程

序言 在上一篇文章中&#xff0c;我们介绍了 协议&#xff0c;协议就是一种约定&#xff0c;规范了双方通信需要遵循的规则、格式和流程&#xff0c;以确保信息能够被准确地传递、接收和理解。  在这篇文章中我们将介绍怎么进行跨网络数据传输&#xff0c;在这一过程中相信大家…

常⻅中间件漏洞(WebLogic)靶场

1.后台弱⼝令GetShell 启动环境 默认账号密码&#xff1a;weblogic/Oracle123 weblogic常⽤弱⼝令&#xff1a;https://cirt.net/passwords?criteriaweblogic 这⾥注意&#xff0c; 单个账号错误密码5次之后就会⾃动锁定。 172.16.1.51:7001/console/login/LoginForm.jsp …

视频剪辑软件排行榜前十名推荐!从入门到专业领域都有!

随着短视频的流行&#xff0c;视频剪辑已成为表达创意、分享故事、获取流量的重要工具。无论是专业视频制作人还是业余爱好者&#xff0c;选择一款合适的视频剪辑软件都至关重要。今天&#xff0c;我们就来盘点一下视频剪辑软件排行榜前十名&#xff0c;帮助你找到最适合自己的…

JavaScript是如何来的~~

文章目录 前言一、网络的诞生 ( The birth of the Web )二、Mosaic 浏览器三、Netscape 浏览器四、JavaScript的诞生 ~ 千呼万唤始出来总结 前言 例如&#xff1a;想要了解一门语言的发展历程&#xff0c;首先你得知道它是怎么来的&#xff0c;所以本文开篇介绍了网络的基本发…

【行为树】01-第一棵树

如何创建一个行为树 行为树,类似于状态机,无非是在正确的时间在正确的条件下调用回调的一种机制。 此外,我们将会交替使用__“callback"和"tick”__这两个词。 这些回调函数里发生的事情取决于你。 在这个教程系列中,大部分时间,Actions 只会在控制台上打印一…

中国土地利用覆盖和变化数据集(1980-2021)

该数据集通过融合森林资源清查数据和20种遥感土地利用产品&#xff0c;重建生成了1980-2015年中国森林覆盖数据集&#xff0c;空间分辨率为11公里。并且在此基础上进一步获得高精度森林覆被信息和土地利用覆盖数据集相融合&#xff0c;生成了中国1980-2021年土地利用覆盖和变化…

Minio上传url资源文件,文件内容不全的问题

遇到问题 使用minio-client时候上传文件为url链接时候&#xff0c;上传inputstream流出现了文件上传成功&#xff0c;但是文件内容缺失&#xff0c;无法正常打开&#xff01; 先看看基本的依赖和配置代码&#xff1a; pom.xml依赖 <!-- tika MIME检测机制 --><depen…

Android NestedScrollView+TabLayout+ViewPager+ 其它布局,ViewPager 不显示以及超出屏幕不显示问题

前言 此场景为 NestedScrollView 嵌套多个布局 &#xff0c;大致结构为 NestedScrollViewTabLayoutViewPagerfragment 其它View,如下图 &#xff0c; 一、ViewPager 设置高度才会显示内容问题 原因&#xff1a;NestedScrollView 计算高度先于 ViewPager 渲染前&#xff0c;所…

电商跨境电商商城系统/网上商城接口/电商数据接口详情

电商API接口背景&#xff1a;电商运营中&#xff0c;数据分析这项工作越来越重要&#xff0c;许多品牌方也越来越热衷去做电商数据分析。不过&#xff0c;全面的数据该如何获取呢&#xff0c;此时&#xff0c;电商数据接口的重要性便凸显出来了。 电商API数据接口主要有以下特…

go 读取excel

一、安装依赖 go get github.com/tealeg/xlsx二、main.go package mainimport "fmt" import "github.com/tealeg/xlsx"type Student struct {Name stringSex string }func (student Student) show() {fmt.Printf("Name:%s Sex:%s\r\n", stude…

OneNet平台替换腾讯云IOT平台(2024年6月)

文章目录 一、前言二、OneNet替换腾讯云IOT三、修改说明&#xff1a;STM32代码3.1 替换MQTT三元组&#xff08;常规操作&#xff09;3.2 修改上传的数据格式。 四、修改说明&#xff1a;服务器配置 一、前言 从2024年06月20日起&#xff0c; 新注册腾讯云物联网开发平台的用户…

浅谈人工智能技术,对社会经济变革的思考

原创 冰锋血骨 芯原创 2024年09月23日 15:44 北京 英国DeepMind公司研发的AlphaGo在2016年3月第一次战胜了围棋世界冠军韩国棋手李世石,人工智能(AI,Artificial Intelligence)第一次映入公众的视野。人工智能是什么?人工智能会想人一样思考吗?人工智能可以应用在哪些领域…

如何用AI论文生成工具撰写一篇高质量的成人教育毕业论文

撰写一篇高质量的成人教育毕业论文并不简单&#xff0c;它有一定的步骤和策略。锐智AI今天就总结了一些关键的步骤&#xff0c;希望对即将毕业的你顺利完成论文写作&#xff1a; 介绍之前简单说下锐智AI&#xff0c;它是一款集论文大纲生成、内容填充、文献引用、查重修改于一…

猎板PCB揭秘厚铜板技术的最新进展

在电子设备不断追求更高性能与更小尺寸的今天&#xff0c;PCB厚铜板技术因其卓越的导电性和散热性能&#xff0c;成为提升电子产品性能的关键材料。猎板PCB今天针对厚铜板的最新技术进展、应用领域及制造流程&#xff0c;为您提供全面的技术资料。 一、PCB厚铜板技术概览 PCB厚…

SpringCloud入门(六)Nacos注册中心(下)

一、Nacos环境隔离 Nacos提供了namespace来实现环境隔离功能。 nacos中可以有多个namespace。namespace下可以有group、service等。不同namespace之间相互隔离&#xff0c;例如不同namespace的服务互相不可见。 使用Nacos Namespace 环境隔离 步骤&#xff1a; 1.在Nacos控制…

007——递归(树的前置知识点)

目录 创建副本 递归 直接调用 间接调用 递归的具体流程又是什么样子的&#xff1f; 递归函数的组成&#xff1a; 递归可以用来解决什么问题&#xff1f; 例子1&#xff1a;求和问题 例子2&#xff1a;斐波那契数列 补充&#xff1a; 说到递归&#xff0c;我们可以简单…

Spring Boot实用小技巧5 - 第527篇

《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《国内最全的Spring Boot系列之七》 SpringBoot …