将ASCII反序列化为struct

时间:2015-06-30 14:32:54

标签: c++ padding

如果要从网络接收消息,我已经提出了以下结构来声明各种格式:

#include <stdint.h>
#include <iostream>
#include <string.h>


template<int T>
struct uint
{
    static uint<T> create(uint64_t value)
    {
        uint<T> r = {value};
        return r;
    }

    uint(uint64_t value)
    {
        v = value;
    }
    uint()
    {}

    uint<T>& operator =(uint64_t value)
    {
        v = value;
        return *this;
    }

    operator uint64_t() const
    {
        return (uint64_t)v;
    }

    unsigned long long v:T;
}__attribute__((packed));

示例:

typedef uint<5> second_t;

假设其中一种消息格式(通过某些过程自动生成)是这样的:

struct seconds
{
    char _type;
    second_t _second;
} __attribute__((packed));

现在假设我想使用字符串填充上述messahe的实例:

int main()
{
 seconds ii;
 const char *i = "123456";
// memset, memcpy,sprintf... ??? what to use here?
 std::cout << ii._type << "  " << ii._second << std::endl;
}

鉴于流123456,我希望secondsii)结构的实例具有char ii._type =&#39; 1&# 39;和整数ii._second = 23456.但我不知道该怎么做。你知道我怎么能这样做吗?你有什么建议如何改善基本结构?

感谢

1 个答案:

答案 0 :(得分:2)

您有许多更简单,更可靠的选项,几乎不需要任何工作。

查看google协议缓冲区(平台无关的消息序列化和反序列化):https://developers.google.com/protocol-buffers/

或boost :: serialization - (可能更快,但不是平台独立的)http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/index.html