当前位置: 首页 > news >正文

【华为OD机试真题 C语言】5、TLV解析 | 机试真题+思路参考+代码解析

文章目录

    • 一、题目
      • 🎃题目描述
      • 🎃输入输出
      • 🎃样例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说明需要解析的信元的Tag31,从码流的起始处开始匹配,Tag32的信元长度为101 00,小端序表示为1);第二个信元的Tag90,其长度为2;第三个信元的Tag30,其长度为3;第四个信元的Tag31,其长度为202 00),所以返回长度后面的两个字节即可,即32 33

二、思路参考

  1. 读取输入的待解码信元的Tag和码流字符串
  2. 将码流字符串按空格分割为字节的字符串数组,每个字节对应一个十六进制数
  3. 遍历字节数组,逐个读取字节并根据小端序合并得到Length的值
  4. Length占用两个字节,根据小端序意味着第一个字节是低位字节,第二个字节是高位字节
  5. 继续遍历字节数组,当找到与输入的Tag相匹配的字节时,提取后续的Length个字节作为Value。注意,Value的每个字节对应一个十六进制数。将提取的Value转换为对应的整数值,即将每个十六进制数转换为其对应的整数
  6. 输出转换后的整数值,作为解码后的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[i+2]) * 256 + hexToInt(byteTokens[i+1]);// 找到对应的Tagif (hexToInt(byteTokens[i]) == hexToInt(tag)) {// 提取后续的Length个字节作为Valuefor (int j = 0; j < length; j++) {value[j] = hexToInt(byteTokens[i+3+j]);}break;}i += (length + 3);}// 输出解码后的值for (int k = 0; k < length; k++) {printf("%02X ", value[k]);}printf("\n");return 0;
}

作者:KJ.JK

http://www.lryc.cn/news/92834.html

相关文章:

  • (七)CSharp-刘铁锰版-事件
  • 【ROS】郭老二博文之:ROS目录
  • Android应用程序进程的启动过程
  • 【2】Midjourney注册
  • 第六十八天学习记录:高等数学:导数(宋浩板书)
  • unreal 5 实现角色拾取功能
  • chatgpt赋能python:如何使用Python升序排列一个列表?
  • Lecture 20 Topic Modelling
  • ThreadPoolExecutor线程池
  • chatgpt赋能python:Python实践:如何升级pip
  • 【JavaEE进阶】mybatis
  • Redis的大key
  • MMPretrain
  • 栈和队列(数据结构刷题)[一]-python
  • 【备战秋招】JAVA集合
  • setState详解
  • Qt5.12.6配置Android Arm开发环境(windows)
  • 七、进程程序替换
  • C++核心编程——详解运算符重载
  • 2023年前端面试汇总-CSS
  • Java调用Pytorch实现以图搜图(附源码)
  • 【EasyX】实时时钟
  • 基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)
  • Kibana:使用 Kibana 自带数据进行可视化(一)
  • MySQL数据库基础 07
  • JVM | JVM垃圾回收
  • avive零头撸矿
  • openGauss5.0之学习环境 Docker安装
  • 数据可视化大屏人员停留系统的开发实录(默认加载条件筛选、单击加载、自动刷新加载、异步加载数据)
  • 【Linux】-关于调试器gdb的介绍和使用