【华为OD机试真题 C++】1004 - TLV解析
文章目录
-
- 一、题目
-
- 🔸题目描述
- 🔸输入输出
- 🔸样例1
- 二、代码参考
- 作者:KJ.JK
🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
🍂个人博客首页: KJ.JK
💖系列专栏:华为OD机试真题(C++)
🍂专栏介绍: 华为OD机试真题汇总,使用C++来进行解析解答实现,帮助大家更好的AC题目,分享各种解题思路,让大家更好通过机试,持续更新中,欢迎大家订阅
一、题目
🔸题目描述
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。
二、代码参考
#include <bits/stdc++.h>using namespace std;#define IOS cin.sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define SZ(x) ((int)(x).size())
typedef pair<int, int> pii;
typedef pair<int, char> pic;
typedef pair<int, string> pis;void SplitString(string input, vector<int> &output, string pattern);class Solution {
public:// 待实现函数,在此函数中填入答题代码;string decodeTLV(string Tag, string TLV){string res;vector <string> TLV_VEC;SplitString(TLV, TLV_VEC, " ");map<string, pis> mp;int i = 0;while (i < TLV_VEC.size()){string tag = TLV_VEC[i];string value;int length = stoi(TLV_VEC[i + 2] + TLV_VEC[i + 1], nullptr, 16);for (int j = 1; j <= length; j++) {value += TLV_VEC[i + 2 + j] + " ";}mp[tag] = make_pair(length, value);i += (length + 3);}return mp[Tag].second.erase(SZ(mp[Tag].second) - 1);}private:void SplitString(string input, vector <string> &output, string pattern){string::size_type pos;input += pattern;for (int i = 0; i < input.size(); i++) {pos = input.find(pattern, i);if (pos < input.size()) {string s = input.substr(i, pos - i);if ((s != " ") && (!s.empty())) {output.push_back(s);}i = pos + pattern.size() - 1;}}}
};int main()
{IOSstring Tag, TLV;cin >> Tag;cin.ignore();getline(cin, TLV);Solution solo;cout << solo.decodeTLV(Tag, TLV) << endl;return 0;
}
作者:KJ.JK
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习