将 ASCII 反序列化为结构
de-serialize ASCII to struct
如果要从网络接收消息,我想出了以下结构来声明各种格式:
#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));
现在假设我想使用字符串填充上述消息的实例:
int main()
{
seconds ii;
const char *i = "123456";
// memset, memcpy,sprintf... ??? what to use here?
std::cout << ii._type << " " << ii._second << std::endl;
}
给定流 123456
,我希望 seconds
(ii
) 结构的实例具有 char
ii._type
= '1' 和整数 ii._second
= 23456。但我不知道该怎么做。你知道我该怎么做吗?你对如何改进基本结构有什么建议吗?
谢谢
您有许多更简单、更可靠的选项,几乎不需要任何工作。
检查 google 协议缓冲区(平台无关的消息序列化和反序列化):https://developers.google.com/protocol-buffers/
或 boost::serialization -(可能更快,但不依赖于平台)http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/index.html
如果要从网络接收消息,我想出了以下结构来声明各种格式:
#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));
现在假设我想使用字符串填充上述消息的实例:
int main()
{
seconds ii;
const char *i = "123456";
// memset, memcpy,sprintf... ??? what to use here?
std::cout << ii._type << " " << ii._second << std::endl;
}
给定流 123456
,我希望 seconds
(ii
) 结构的实例具有 char
ii._type
= '1' 和整数 ii._second
= 23456。但我不知道该怎么做。你知道我该怎么做吗?你对如何改进基本结构有什么建议吗?
谢谢
您有许多更简单、更可靠的选项,几乎不需要任何工作。
检查 google 协议缓冲区(平台无关的消息序列化和反序列化):https://developers.google.com/protocol-buffers/
或 boost::serialization -(可能更快,但不依赖于平台)http://www.boost.org/doc/libs/1_58_0/libs/serialization/doc/index.html