TLV 编码是按 [ Tag Length Value ] 格式进行编码的,一段码流中的信元用Tag标识, Tag在码流中唯一不重复 ,Length表示信元Value的长度,Value表示信元的值。
码流以某信元的Tag开头,Tag固定占 一个字节,Length固定占两个字节,字节序为 小端序 。
现给定TLV格式编码的码流,以及需要解码的信元Tag,请输出该信元的Value。
输入码流的16进制字符中,不包括小写字母,且要求输出的16进制字符串中也不要包含小写字母;
码流字符串的最大长度不超过50000个字节。
输入描述:
输入的第一行为一个字符串,表示待解码信元的 Tag ;
输入的第二行为一个字符串,表示待解码的 16进制码流 ,字节之间用空格分隔 。
输出描述:
输出一个字符串,表示待解码信元以16进制表示的 Value 。
输入:
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
(1)需要解析的信元的Tag是31,从码流的起始处开始匹配,
Tag为32的信元长度为1(01 00,小端序表示为1);
(2)第二个信元的Tag是90,其长度为2;
(3)第三个信元的Tag是30,其长度为3;
(4)第四个信元的Tag是31,其长度为2(02 00),所以返回长度后面的两个字节即可,即32 33。
int main()
{unsigned int i, tag, codeStreamNum, length, value;unsigned int buf[2] = { 0 }; /* 用来存小端序length的值 */while (scanf("%X", &tag) != EOF) {while (scanf("%X", &codeStreamNum) != EOF) {(void)scanf("%X", &buf[0]);(void)scanf("%X", &buf[1]);length = buf[1] << 16 | buf[0]; /* 转换为大端序 */if (codeStreamNum == tag) {for (i = 0; i < length; i++) {(void)scanf("%X", &value);if (i != length - 1) {printf("%X ", value);} else {printf("%Xn", value);}}} else { /* 不匹配tag,则读出来,不处理 */for (i = 0; i < length; i++) {(void)scanf("%X", &value);}}/* 如果处理完整个码流字符串则退出循环,继续获取目标tag */if (getchar() == 'n') {break;}}}return 0;
}
本文发布于:2024-02-13 12:21:18,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1715489331252835.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |