如果要从网络接收消息,我已经提出了以下结构来声明各种格式:
#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
,我希望seconds
(ii
)结构的实例具有char
ii._type
=&#39; 1&# 39;和整数ii._second
= 23456.但我不知道该怎么做。你知道我怎么能这样做吗?你有什么建议如何改善基本结构?
感谢
答案 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