Aka*_*kay 0 c arrays struct pragma-pack
我在C中有一个1字节的pragma打包结构,我希望将其复制到一个字节数组中,以便通过串口发送序列化.
#pragma pack(push, 1)
typedef struct {
uint8_t ck_a;
uint8_t ck_b;
} UBXChecksum_t ;
#pragma pack(pop)
Run Code Online (Sandbox Code Playgroud)
将序列化为字节数组的最佳方法是什么,我应该使用memcpy()吗?
void writeStructToArray(const void* inStruct,
const uint16_t inLenStruct,
uint8_t* const outArray)
{
memcpy(outArray, inStruct, inLenStruct);
}
Run Code Online (Sandbox Code Playgroud)
或者更好地使用逐字节复制做指针类型转换?
void writeStructToArray(const void* inStruct,
const uint16_t inLenStruct,
uint8_t* const outArray)
{
for(uint16_t i = 0; i < inLenStruct; i++)
{
outArray[i] = ((uint8_t*)inStruct)[i];
}
}
Run Code Online (Sandbox Code Playgroud)
正如卡米尔·库克所评论的那样,你的两个建议几乎相同,可能存在速度上的差异.
另一种选择是使用联盟:
typedef struct {
uint8_t ck_a;
uint8_t ck_b;
} UBXChecksum_t ;
union convert {
UBXChecksum_t checksum;
char buffer[sizeof UBXChecksum_t];
};
UBXChecksum_t checksum;
union convert converter;
converter.checksum = checksum;
passArrayToSomeFunction(converter.buffer, sizeof(converter.buffer));
Run Code Online (Sandbox Code Playgroud)
您不必复制数据以将其转换为数组.您可以将指针传递给结构(如果需要转换为char*或void*),并将结构大小传递给将数据发送到串行端口的函数.例:
typedef struct {
uint8_t ck_a;
uint8_t ck_b;
} UBXChecksum_t ;
int sendData(void *buf, size_t size);
UBXChecksum_t checksum;
/* ... */
int rc = sendData(&checksum, sizeof(checksum));
Run Code Online (Sandbox Code Playgroud)
所有这些变体都将结构的内部表示作为二进制数据发送.通常,"序列化"被理解为将数据转换为与平台无关的格式的方式.
如果接收系统具有相同类型并使用相同的编译器,则发送二进制数据结构.当接收系统使用不同的字节顺序或不同的数据类型大小时,您可能会遇到问题.
在您的情况下,您有两个uint8_t值的结构,因此大小是固定的,字节顺序不是问题.
如果结构的要求与指定的二进制数据协议匹配,并且您准备在必要时处理字节顺序,则可以发送二进制数据.
| 归档时间: |
|
| 查看次数: |
268 次 |
| 最近记录: |