TVL解码
这题对前端是真的不友好,不知道它在说啥
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
说明:
需要解析的信源的tag是31
从码流的起始处开始匹配,tag为32的信元长度为1(01 00,小端序表示为1)
第二个信元的tag为90 其长度为2
第三个信元的tag为30 其长度为3
第四个信元的tag为31 其长度为2(02 00)
所以返回长度后面的两个字节即可 为 32 33
let tag = '31';
let data = '32 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC';
let split = data.split(" ");
for (let i = 0; i < split.length;) {
let length = parseInt(split[i + 2] + split[i + 1], 16);
if (tag===split[i]) {
let builder = []
for (let j = i + 3; j < i + 3 + length; j++) {
builder.push(split[j]);
}
console.log(builder.join(' '));
break;
} else {
i += length + 3;
}
}
机试题 文章被收录于专栏
某机试题,网上很少用js写的答案只有自己写了