面试题答案
一键面试#include <stdio.h>
// 定义数据包联合体
union Packet {
struct {
unsigned char flag: 8;
unsigned short seq_num: 16;
unsigned int timestamp: 32;
} fields;
unsigned char data[7]; // 7 字节,8 + 16 + 32 位共 56 位,7 字节
};
// 填充数据
void fillPacket(union Packet *packet, unsigned char flag, unsigned short seq_num, unsigned int timestamp) {
packet->fields.flag = flag;
packet->fields.seq_num = seq_num;
packet->fields.timestamp = timestamp;
}
// 提取数据
void extractPacket(union Packet *packet, unsigned char *flag, unsigned short *seq_num, unsigned int *timestamp) {
*flag = packet->fields.flag;
*seq_num = packet->fields.seq_num;
*timestamp = packet->fields.timestamp;
}
在上述代码中:
- 联合体定义:定义了一个
union Packet
,其中包含一个结构体fields
用于按位存储不同类型数据,以及一个unsigned char
数组data
用于整体存储数据。 - 填充数据函数:
fillPacket
函数用于将传入的flag
、seq_num
和timestamp
填充到数据包中。 - 提取数据函数:
extractPacket
函数用于从数据包中提取flag
、seq_num
和timestamp
。
使用示例:
int main() {
union Packet packet;
unsigned char flag = 0x42;
unsigned short seq_num = 1234;
unsigned int timestamp = 567890123;
fillPacket(&packet, flag, seq_num, timestamp);
unsigned char extractedFlag;
unsigned short extractedSeq_num;
unsigned int extractedTimestamp;
extractPacket(&packet, &extractedFlag, &extractedSeq_num, &extractedTimestamp);
printf("Flag: 0x%02hhx\n", extractedFlag);
printf("Seq_num: %hu\n", extractedSeq_num);
printf("Timestamp: %u\n", extractedTimestamp);
return 0;
}