MST
星途 面试题库

面试题:C语言联合体在网络编程中数据封装的应用

在网络编程中,常常需要将不同类型的数据封装成一个数据包进行发送。假设我们有一个网络数据包,其中包含一个8位的标志位(flag)、一个16位的序列号(seq_num)以及一个32位的时间戳(timestamp)。请使用C语言联合体来设计这个数据包的结构体,并说明如何进行数据的填充和提取。
37.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#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;
}

在上述代码中:

  1. 联合体定义:定义了一个union Packet,其中包含一个结构体fields用于按位存储不同类型数据,以及一个unsigned char数组data用于整体存储数据。
  2. 填充数据函数fillPacket函数用于将传入的flagseq_numtimestamp填充到数据包中。
  3. 提取数据函数extractPacket函数用于从数据包中提取flagseq_numtimestamp

使用示例:

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;
}