目录 

题目

思路

Code


题目

两端通过TLV格式的报文来通信,现在收到对端的一个TLV格式的消息包,要求生成匹配后的(tag,length,valueOffset)列表。
具体要求如下:
(1)消息包中多组tag、length、value紧密排列,其中tag,length各占1字节(uint8 t),value所占字节数等于length的值

(2)结果数组中tag值已知,需要填充每个tag对应数据的length和valueOffset值(valueOffset为value在原消息包中的起始偏移量 (从0开始,以字节为单位)),
即将消息包中的tag与结果数组中的tag进行匹配(可能存在匹配失败的情况,若结果数组中的tag在消息包中找不到,则ength和valueOffset都为0)
(3)消息包和结果数组中的tag值都按升序排列,且不重复

(4)此消息包未被篡改,但尾部可能不完整,不完整的一组TLV请丢弃掉
输入描述
第一行: 一个字符串,代表收到的消息包。字符串长度在10000以内。
。说明1: 字符串使用十六进制文本格式(字母为大写)来展示消息包的数据,如0F04ABABABAB代表一组TLV:前两个字符(0F)代表tag值为15,接下来两个字符 (04)代表length值为4字节,接下来8个字符即为4字节的value。说明2: 输入字符串中,每一组TLV紧密排列,中间无空格等分隔符
第二行: 需要匹配的tag数量n (0 < n <1000).
后面n行: 需要匹配的n个tag值 (十进制表示),递增排列。
输出描述
和需要匹配的n个tag对应的n行匹配结果,每一行由长度和偏移量组成
示例1:

输入
0F04ABABABAB

1
15
输出

4 2
说明
tag15(十六进制OF)对应数据的长度为4,其value从第三个字节开始,因此偏移量为2

示例2:

输入

0F04ABABABAB1001FF

2
15

17
输出

4 2
0 0
说明
第二个tag匹配失败

思路

见代码注释

Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
#include <limits.h>
#include <float.h>
#include <regex.h>
#include <ctype.h>
 
#define CEILING_POS(X) ((X-(int)(X)) > 0 ? (int)(X+1) : (int)(X))
#define CEILING_NEG(X) ((X-(int)(X)) < 0 ? (int)(X-1) : (int)(X))
#define CEILING(X) ( ((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X) )
 
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
#define MAX(a, b) ((a) > (b)) ? (a) : (b)
 
int cmpfunc (const void * a, const void * b) {
   return  *(int*)a - *(int*)b;
}
//qsort(dp, m+1, sizeof(int), cmpfunc);
 
/*
char input1[200000];
    fgets(input1, 200000, stdin);
 
    //逗号分隔
    char* token1 = strtok(input1, ",");
    int nums1[1000];
    int target1 = 0;
    while (token1 != NULL) {
        nums1[target1++] = atoi(token1);
        token1 = strtok(NULL, ",");
    }*/
 
 
int cmp(const void *a,const void *b)
{
    int *ap = (int *)a;       
    int *bp = (int *)b;
    if(bp[0] == ap[0]){
        return ap[1] - bp[1];
    } else {
        return ap[0] - bp[0];
    }
} 
//qsort(a, n, sizeof(a[0]), cmp);
 
int cmp1(const void *a,const void *b)
{
    int *ap = (int *)a;       
    int *bp = (int *)b;
    return ap[0] - bp[0];
    
} 


int main() {
    char msg[200];
    fgets(msg, 200, stdin);

    char input1[200];
    fgets(input1, 200, stdin);
    int count = atoi(input1);

    int tags[count];
    for (int i=0;i<count;i+=1){
        char input2[200];
        fgets(input2, 200, stdin);
        tags[i] = atoi(input2);
    }
    
    
    

    int ans[count][2];
    int preIndex = 0;
    for (int i=0;i<strlen(msg);i+=preIndex){
        char target[2];
        target[0] = msg[i];
        target[1] = msg[i+1];
        long int tag = strtol(target, NULL, 16);
        target[0] = msg[i+2];
        target[1] = msg[i+3];
        long int len = strtol(target, NULL, 16);
        for (int j=0;j<count;j++){
            if (tag==tags[j]){
                ans[j][0] = len;
                ans[j][1] = preIndex/2+2;
            }
        }
        preIndex += 2*len+4;
    }
    for (int i=0;i<count;i++){
        printf("%d %d\n", ans[i][0], ans[i][1]);
    }
    
    char hex_str[] = "0F"; // 示例16进制字符串
    long int num = strtol(hex_str, NULL, 16); // 转换为长整型
    printf("The integer is: %ld\n", num); // 输出转换后的整数

    return 0;
}

【华为od机试真题Python+JS+Java合集】【超值优惠】:Py/JS/Java合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java】:Java真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群:830285880】