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");
|
|||
|
}
|
|||
|
```
|