61fe688ec4
Affected files: 代码/不定长结构体.md 模拟电路/RTC.md
73 lines
2.3 KiB
Markdown
73 lines
2.3 KiB
Markdown
---
|
||
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");
|
||
}
|
||
``` |