MST

星途 面试题库

面试题:C语言结构体中位域在数据传输优化中的应用

假设你正在开发一个网络通信模块,需要将一些状态信息打包成一个字节发送出去。设计一个结构体,使用位域来表示这些状态信息,包括一个4位的设备ID、2位的操作类型、1位的是否成功标志和1位的保留位。编写函数将结构体数据打包成一个字节,并编写另一个函数将接收到的字节解析回结构体。
19.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义结构体,使用位域表示状态信息
typedef struct {
    unsigned int deviceID : 4;
    unsigned int operationType : 2;
    unsigned int successFlag : 1;
    unsigned int reserved : 1;
} StatusInfo;

// 打包函数,将结构体数据打包成一个字节
unsigned char packStatusInfo(StatusInfo info) {
    unsigned char result = 0;
    result |= info.deviceID;
    result |= (info.operationType << 4);
    result |= (info.successFlag << 6);
    result |= (info.reserved << 7);
    return result;
}

// 解析函数,将接收到的字节解析回结构体
StatusInfo unpackStatusInfo(unsigned char byte) {
    StatusInfo info;
    info.deviceID = byte & 0x0F;
    info.operationType = (byte >> 4) & 0x03;
    info.successFlag = (byte >> 6) & 0x01;
    info.reserved = (byte >> 7) & 0x01;
    return info;
}

你可以使用以下方式测试这些函数:

int main() {
    StatusInfo originalInfo = {3, 1, 1, 0};  // 示例数据
    unsigned char packedByte = packStatusInfo(originalInfo);
    StatusInfo unpackedInfo = unpackStatusInfo(packedByte);

    printf("Original deviceID: %d\n", originalInfo.deviceID);
    printf("Original operationType: %d\n", originalInfo.operationType);
    printf("Original successFlag: %d\n", originalInfo.successFlag);
    printf("Original reserved: %d\n", originalInfo.reserved);

    printf("Packed byte: 0x%02X\n", packedByte);

    printf("Unpacked deviceID: %d\n", unpackedInfo.deviceID);
    printf("Unpacked operationType: %d\n", unpackedInfo.operationType);
    printf("Unpacked successFlag: %d\n", unpackedInfo.successFlag);
    printf("Unpacked reserved: %d\n", unpackedInfo.reserved);

    return 0;
}