免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4439 | 回复: 5
打印 上一主题 下一主题

[C++] 一个序列化和反序列化的小工具 [复制链接]

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:51:33
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-03-05 18:25 |只看该作者 |倒序浏览
  1. #ifndef FIXEDBUFFER_H
  2. #define FIXEDBUFFER_H

  3. #define FIXEDBUFFER_LENGTH_TYPE uint16_t
  4. class FixedBuffer
  5. {
  6. private:
  7.         unsigned char* _buffer;
  8.         size_t _rpos;
  9.         size_t _wpos;
  10.         size_t _capacity;
  11.         bool _readonly;
  12.        
  13. public:
  14.         FixedBuffer(size_t capacity, bool readonly = false)
  15.                 : _rpos(0)
  16.                 , _wpos(0)
  17.                 , _readonly(readonly)
  18.         {
  19.                 _buffer = new unsigned char[capacity];
  20.                 _capacity = capacity;
  21.         }

  22.         FixedBuffer(unsigned char* buffer, size_t capacity, bool readonly = true)
  23.                 : _buffer(buffer)
  24.                 , _rpos(0)
  25.                 , _wpos(capacity)
  26.                 , _capacity(capacity)
  27.                 , _readonly(readonly)
  28.         {
  29.         }

  30.         ~FixedBuffer()
  31.         {
  32.                 if (!_readonly)
  33.                         delete[] _buffer;
  34.         }

  35.         inline size_t rpos() const { return _rpos; }
  36.         inline size_t wpos() const { return _wpos; }
  37.         inline const unsigned char* c_arr() { return _buffer; }

  38.         template<class T>
  39.         FixedBuffer& operator<<(const T t)
  40.         {
  41.                 if (_wpos + sizeof(t) >= _capacity)
  42.                         throw std::exception();
  43.                 memcpy(_buffer + _wpos, (unsigned char*)&t, sizeof(t));
  44.                 _wpos += sizeof t;

  45.                 return *this;
  46.         }

  47.         FixedBuffer& operator<<(const std::string& t)
  48.         {
  49.                 if (_wpos + sizeof(FIXEDBUFFER_LENGTH_TYPE) + t.size() >= _capacity)
  50.                         throw std::exception();
  51.                 size_t size = t.size();
  52.                 memcpy(_buffer + _wpos, (unsigned char*)&size, sizeof(FIXEDBUFFER_LENGTH_TYPE));
  53.                 memcpy(_buffer + _wpos + sizeof(FIXEDBUFFER_LENGTH_TYPE), (unsigned char*)t.c_str(), t.size());
  54.                 _wpos += sizeof(FIXEDBUFFER_LENGTH_TYPE) + t.size();

  55.                 return *this;
  56.         }

  57.         template<class T>
  58.         FixedBuffer& operator>>(T& t)
  59.         {
  60.                 if (_rpos + sizeof(t) > _wpos)
  61.                         throw std::exception();
  62.                 memcpy((void*)&t, _buffer + _rpos, sizeof(t));
  63.                 _rpos += sizeof t;

  64.                 return *this;
  65.         }

  66.         FixedBuffer& operator>>(std::string& t)
  67.         {
  68.                 if (_rpos + sizeof(FIXEDBUFFER_LENGTH_TYPE) > _wpos)
  69.                         throw std::exception();
  70.                 size_t size;
  71.                 memcpy((void*)&size, _buffer + _rpos, sizeof(FIXEDBUFFER_LENGTH_TYPE));
  72.                 if (_rpos + sizeof(FIXEDBUFFER_LENGTH_TYPE) + size > _wpos)
  73.                         throw std::exception();
  74.                 t.resize(size);
  75.                 memcpy((void*)&t[0], _buffer + _rpos + sizeof(FIXEDBUFFER_LENGTH_TYPE), size);
  76.                
  77.                 _rpos += sizeof(FIXEDBUFFER_LENGTH_TYPE) + size;

  78.                 return *this;
  79.         }
  80. };
  81. #endif
复制代码

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
2 [报告]
发表于 2015-03-05 19:20 |只看该作者
LZ的工具是做什么用的呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
3 [报告]
发表于 2015-03-05 20:11 |只看该作者
protobuf 是不是更好一些呢

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-03-05 21:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2015-03-06 09:57 |只看该作者
这个库的功能还是少了点,做协议不但要考虑序列化,还要考虑大小端,协议升级兼容,跨语言传递

可以参考一下我的库 github 上搜索 adata

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2015-03-06 09:59 |只看该作者
居然对string这么干,我想是问题多多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP