TLV编码

题目描述

TLV编码是按TagLengthValue格式进行编码的。
一段码流中的信元用tag标识,tag在码流中唯一不重复,length表示信元value的长度,value表示信元的值,码流以某信元的tag开头,tag固定占一个字节,length固定占两个字节,字节序为小端序。现给定tlv格式编码的码流以及需要解码的信元tag,请输出该信元的value。

输入码流的十六进制字符中,不包括小写字母;
且要求输出的十六进制字符串中也不要包含小写字母;
码流字符串的最大长度不超过50000个字节。

输入描述

第一行为一个字符串 ,表示待解码信元的tag;
第二行为一个字符串, 表示待解码的十六进制码流;
字节之间用空格分割。

输出描述

输出一个字符串,表示待解码信元以十六进制表示的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。
*/

解题思路

1、观察截取字串的规律,并不断更新母串;
2、16进制的小端字节序转换为十进制数;

C++代码实现

#include<iostream>
#include<string>
using namespace std;

int lenHexToInt(string s){
	int temp = stoi(s);
	int count = 0, res = 0;
	while (temp) {
		res += ((temp % 10)*pow(16, count));
		count++;
		temp /= 10;
	}
	return res;
}

int main()
{
	string str1, str2;
	getline(cin, str1);
	getline(cin, str2);

	while (!str2.empty()) {
		string head = str2.substr(0, 2);
		string lenHex = str2.substr(6, 2) + str2.substr(3, 2);
		int len = lenHexToInt(lenHex);

		if (head == str1)
			cout << str2.substr(9, len * 3 - 1) << endl;

		if ((9 + len * 3) > static_cast<int>(str2.size()))
			str2 = str2.substr(9 + len * 3 - 1);
		else
			str2 = str2.substr(9 + len * 3);
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值