安全结构数组作为普通字节流

时间:2016-04-12 16:51:28

标签: c arrays struct

我给出了一系列结构:

typedef struct sRawMsg{
    int a;
}sRawMsg;

sRawMsg RawMsg[10];

首先,struct数组条目用数据填充。然后将数据复制到作为2D阵列给出的输出缓冲区。

// sending buffer which allocates memory for the array struct
static unsigned char sendingBuffer[10][sizeof(sRawMsg)];

for(int i = 0; i < 10; ++i)
{
    sRawMsg* pMsg = &(RawMsg[i]);
    // data is now stored in the struct array @ pos i
    ...
    // data from the struct entry is now saved in the output sending buffer 
    memcopy(&(sendingBuffer[i][0]), pMsg, sizeof(sRawMsg));
}

获得的输出缓冲区通过无线连接作为普通字节阵列传输。由于我是C编程的新手,我想问一下是否存在更有效/优雅/安全的方法来处理struct数组数据。

1 个答案:

答案 0 :(得分:2)

由于你在结构中没有任何填充(一个元素结构不能用任何普通的编译器填充),你可以简单地传递

(unsigned char *)&RawMsg[0]

作为发送函数的参数。

如果您要将数据转换为固定格式(例如网络顺序),或者您的结构包含在元素之间填充的类型的混合,或者您的结构包含指向字符串的指针(或其他指向数据的指针),你必须更加努力工作 - 使用与你正在做的类似的序列化。使用指向字符串的指针,您可能需要一个知道如何识别字符串长度的协议。一种这样的约定称为TLV(Type, length, value)。另一个(更复杂的)是ASN.1。或者,您可以使用JSONBSON或Google Protocol buffers等格式。