龙南县建设局网站,上海12333公共招聘网,腾讯云wordpress帐号,在小网站上做点击广告文章目录 一、题目#x1f383;题目描述#x1f383;输入输出#x1f383;样例1 二、思路参考三、代码参考#x1f3c6;C语言 作者#xff1a;KJ.JK #x1f342;个人博客首页#xff1a; KJ.JK #x1f342;专栏介绍#xff1a; 华为OD机试真题汇总#xff0c;定期… 文章目录 一、题目题目描述输入输出样例1 二、思路参考三、代码参考C语言 作者KJ.JK 个人博客首页 KJ.JK 专栏介绍 华为OD机试真题汇总定期更新华为OD各个时间阶段的机试真题每日定时更新本专栏将使用C语言进行更新解答包含真题思路分析代码参考欢迎大家订阅学习 一、题目 题目描述 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的信元长度为101 00小端序表示为1第二个信元的Tag是90其长度为2第三个信元的Tag是30其长度为3第四个信元的Tag是31其长度为202 00所以返回长度后面的两个字节即可即32 33。 二、思路参考
读取输入的待解码信元的Tag和码流字符串将码流字符串按空格分割为字节的字符串数组每个字节对应一个十六进制数遍历字节数组逐个读取字节并根据小端序合并得到Length的值Length占用两个字节根据小端序意味着第一个字节是低位字节第二个字节是高位字节继续遍历字节数组当找到与输入的Tag相匹配的字节时提取后续的Length个字节作为Value。注意Value的每个字节对应一个十六进制数。将提取的Value转换为对应的整数值即将每个十六进制数转换为其对应的整数输出转换后的整数值作为解码后的Value。 三、代码参考 C语言
#include stdio.h
#include stdlib.h
#include string.h// 函数将一个字节的十六进制字符串转换为对应的整数值
int hexToInt(char* hex) {int value;sscanf(hex, %x, value);return value;
}int main() {char tag[3]; // 信元的Tagchar byteStream[50001]; // 码流字符串char* byteTokens[50000]; // 字节的字符串数组int byteCount 0; // 字节的个数char value[50000]; // 解码后的Valueint length; // 信元Value的长度// 读取输入的Tag和码流字符串scanf(%s\n, tag);fgets(byteStream, sizeof(byteStream), stdin);// 将码流字符串按空格分割为字节的字符串数组byteTokens[byteCount] strtok(byteStream, );while (byteTokens[byteCount-1] ! NULL) {byteTokens[byteCount] strtok(NULL, );}// 解析码流找到对应的Tag并提取Valueint i 0;while (i byteCount) {// 根据小端序合并字节得到Length的值length hexToInt(byteTokens[i2]) * 256 hexToInt(byteTokens[i1]);// 找到对应的Tagif (hexToInt(byteTokens[i]) hexToInt(tag)) {// 提取后续的Length个字节作为Valuefor (int j 0; j length; j) {value[j] hexToInt(byteTokens[i3j]);}break;}i (length 3);}// 输出解码后的值for (int k 0; k length; k) {printf(%02X , value[k]);}printf(\n);return 0;
} 作者KJ.JK