目录
题目
思路
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:输入
0F04ABABABAB1
15
输出4 2
说明
tag15(十六进制OF)对应数据的长度为4,其value从第三个字节开始,因此偏移量为2示例2:
输入
0F04ABABABAB1001FF
2
1517
输出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】