目录 

题目

思路

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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.

【华为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】