obsidian-notes/代码/不定长结构体.md
murmur 61fe688ec4 Matebook更新了2个文件
Affected files:
代码/不定长结构体.md
模拟电路/RTC.md
2024-07-31 22:27:50 +08:00

73 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
tags:
- 不定长
- 代码块
- 源码
- 结构体
---
定长结构体容易初始化和使用,容易转换为单一字节数组,后者交互方便,如发送`send(uint8 data, uint8 len)`
在C语言中可以使用结构体和柔性数组flexible array member来表示不定长帧格式的数组。这种技术通常用于动态分配内存以便存储不定长度的数据。
使用柔性数组可以方便对数据按指定帧格式进行编码,指定长度后即可理解为成为了定长结构体。
**将一个包含柔性数组成员的结构体转换为一个单一的字节数组**是可行的,但需要考虑如何处理每个成员的字节对齐和大小问题。以下是一个示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
struct Frame {
int id; // 其它成员
float value; // 其它成员
int length; // 帧的长度
char data[]; // 柔性数组成员,用来存储帧的数据
};
// 函数声明:将结构体数据以字节数组的形式输出
void printFrameAsBytes(struct Frame *frame);
int main() {
int frameLength = 10; // 假设帧的长度为10
struct Frame *myFrame;
// 分配内存,包括柔性数组部分
myFrame = malloc(sizeof(struct Frame) + frameLength * sizeof(char));
if (myFrame == NULL) {
perror("Memory allocation failed");
return 1;
}
// 设置结构体的成员
myFrame->id = 1234;
myFrame->value = 56.78;
myFrame->length = frameLength;
// 向帧中存入数据
for (int i = 0; i < frameLength; i++) {
myFrame->data[i] = 'A' + i; // 示例数据
}
// 调用函数打印结构体数据的字节表示
printFrameAsBytes(myFrame);
// 释放动态分配的内存
free(myFrame);
return 0;
}
// 定义函数:将结构体数据以字节数组的形式输出
void printFrameAsBytes(struct Frame *frame) {
// 计算整个结构体的大小
size_t totalSize = sizeof(struct Frame) + frame->length * sizeof(char);
// 将结构体转换为字节数组
unsigned char *byteArray = (unsigned char *)frame;
// 输出字节数组
printf("Frame as bytes:\n");
for (size_t i = 0; i < totalSize; i++) {
printf("0x%02x ", byteArray[i]);
}
printf("\n");
}
```