在C中将结构序列化/反序列化为char*

Ank*_*han 5 c c++ serialization

我有一个结构

struct Packet {
    int senderId;
    int sequenceNumber;
    char data[MaxDataSize];

    char* Serialize() {
        char *message = new char[MaxMailSize];
        message[0] = senderId;
        message[1] = sequenceNumber;
        for (unsigned i=0;i<MaxDataSize;i++)
            message[i+2] = data[i];
        return message;
    }

    void Deserialize(char *message) {
        senderId = message[0];
        sequenceNumber = message[1];
        for (unsigned i=0;i<MaxDataSize;i++)
            data[i] = message[i+2];
    }

};
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为char*,最大长度MaxMailSize> MaxDataSize用于通过网络发送,然后在另一端反序列化

我不能使用tpl或任何其他库.

有没有办法让这更好我对此不太满意,或者这是我们能做的最好的事情.

Adr*_*son 6

由于这是通过网络发送的,我强烈建议您在发送之前将这些数据转换为网络字节顺序,并在接收时返回主机字节顺序.这是因为字节顺序在任何地方都不一样,一旦你的字节顺序不正确,反转它们可能变得非常困难(取决于接收方使用的编程语言).字节排序功能与插座一起界定,并分别命名为htons(),htonl(),ntohs()ntohl().(在这些名称中:h表示'主机'或您的计算机,n表示'网络',s表示'短'或16位值,l表示'长'或32位值).

然后你自己进行序列化,C和C++没有自动执行它的方法.一些软件可以生成代码来为您完成,例如ASN.1实现asn1c,但它们很难使用,因为它们不仅仅涉及通过网络复制数据.