#ifndef _BYTEBUFFER_H
#define _BYTEBUFFER_H #include <msgpack.hpp>
typedef unsigned char uint8; /* Unsigned 8 bit quantity */
typedef signed char int8; /* Signed 8 bit quantity */
typedef unsigned short uint16; /* Unsigned 16 bit quantity */
typedef signed short int16; /* Signed 16 bit quantity */
typedef unsigned int uint32; /* Unsigned 32 bit quantity */
typedef signed int int32; /* Signed 32 bit quantity */
typedef signed long int64;
typedef unsigned long uint64; class ByteBuffer {
public:
const static size_t DEFAULT_SIZE = 0x1000; ByteBuffer(): _rpos(), _wpos()
{
_storage.reserve(DEFAULT_SIZE);
}
ByteBuffer(size_t res): _rpos(), _wpos()
{
_storage.reserve(res);
}
ByteBuffer(const ByteBuffer &buf): _rpos(buf._rpos), _wpos(buf._wpos), _storage(buf._storage) { }
virtual ~ByteBuffer() {} void clear() {
_storage.clear();
_rpos = _wpos = ;
} template <typename T> void append(T value)
{
append((uint8 *)&value, sizeof(value));
} template <typename T> void put(size_t pos,T value)
{
put(pos,(uint8 *)&value,sizeof(value));
} ByteBuffer &operator<<(bool value)
{
append<char>((char)value);
return *this;
} // unsigned
ByteBuffer &operator<<(uint8 value)
{
append<uint8>(value);
return *this;
} ByteBuffer &operator<<(uint16 value)
{
append<uint16>(value);
return *this;
} ByteBuffer &operator<<(uint32 value)
{
append<uint32>(value);
return *this;
} ByteBuffer &operator<<(uint64 value)
{
append<uint64>(value);
return *this;
} // signed as in 2e complement
ByteBuffer &operator<<(int8 value)
{
append<int8>(value);
return *this;
} ByteBuffer &operator<<(int16 value)
{
append<int16>(value);
return *this;
} ByteBuffer &operator<<(int32 value)
{
append<int32>(value);
return *this;
} ByteBuffer &operator<<(int64 value)
{
append<int64>(value);
return *this;
} ByteBuffer &operator<<(float value)
{
append<float>(value);
return *this;
} ByteBuffer &operator<<(double value)
{
append<double>(value);
return *this;
}
/*
ByteBuffer &operator<<(const std::string &value) {
append((uint8 *)value.c_str(), value.length());
append((uint8)0);
return *this;
}
ByteBuffer &operator<<(const char *str) {
append((uint8 *)str, strlen(str));
append((uint8)0);
return *this;
}*/
ByteBuffer &operator<<(const std::string &value) {
*this << (uint16)value.length();
append((uint8 *)value.c_str(), value.length());
return *this;
}
ByteBuffer &operator<<(const char *str) {
uint16 len = strlen(str);
*this << len;
append((uint8 *)str, len);
return *this;
} // stream like operators for reading data
ByteBuffer &operator>>(bool &value) {
value = read<char>() > ? true : false;
return *this;
}
//unsigned
ByteBuffer &operator>>(uint8 &value) {
value = read<uint8>();
return *this;
}
ByteBuffer &operator>>(uint16 &value) {
value = read<uint16>();
return *this;
}
ByteBuffer &operator>>(uint32 &value) {
value = read<uint32>();
return *this;
}
ByteBuffer &operator>>(uint64 &value) {
value = read<uint64>();
return *this;
}
//signed as in 2e complement
ByteBuffer &operator>>(int8 &value) {
value = read<int8>();
return *this;
}
ByteBuffer &operator>>(int16 &value) {
value = read<int16>();
return *this;
}
ByteBuffer &operator>>(int32 &value) {
value = read<int32>();
return *this;
}
ByteBuffer &operator>>(int64 &value) {
value = read<int64>();
return *this;
}
ByteBuffer &operator>>(float &value) {
value = read<float>();
return *this;
}
ByteBuffer &operator>>(double &value) {
value = read<double>();
return *this;
}
/*
ByteBuffer &operator>>(std::string& value) {
value.clear();
while (true) {
char c=read<char>();
if (c==0)
break;
value+=c;
}
return *this;
}*/
ByteBuffer &operator>>(std::string& value) {
uint16 len;
*this >> len;
if(len > ) {
value.resize(len);
read((uint8*)value.c_str(), len);
} else {
value.clear();
}
return *this;
} uint8 operator[](size_t pos) {
return read<uint8>(pos);
} size_t rpos() {
return _rpos;
}; size_t rpos(size_t rpos) {
_rpos = rpos;
return _rpos;
}; size_t wpos() {
return _wpos;
} size_t wpos(size_t wpos) {
_wpos = wpos;
return _wpos;
} template <typename T> T read() {
T r=read<T>(_rpos);
_rpos += sizeof(T);
return r;
}; template <typename T> T read(size_t pos) const {
//ASSERT(pos + sizeof(T) <= size());
if(pos + sizeof(T) > size())
{
return (T);
} else {
return *((T*)&_storage[pos]);
}
} void read(uint8 *dest, size_t len) {
if (_rpos + len <= size()) {
memcpy(dest, &_storage[_rpos], len);
} else {
//throw error();
memset(dest, , len);
}
_rpos += len;
} const uint8 *contents() const { return &_storage[]; }; size_t size() const { return _storage.size(); }; void resize(size_t newsize) {
_storage.resize(newsize);
_rpos = ;
_wpos = size();
}; void reserve(size_t ressize) {
if (ressize > size()) _storage.reserve(ressize);
}; void append(const char *src, size_t cnt) {
return append((const uint8 *)src, cnt);
} void append(const uint8 *src, size_t cnt) {
if (!cnt) return;
if (_storage.size() < _wpos + cnt)
_storage.resize(_wpos + cnt);
memcpy(&_storage[_wpos], src, cnt);
_wpos += cnt;
} void append(const ByteBuffer& buffer) {
if(buffer.size() > ) append(buffer.contents(),buffer.size());
} void put(size_t pos, const uint8 *src, size_t cnt) {
memcpy(&_storage[pos], src, cnt);
} void hexlike()
{
uint32 j = , k = ;
printf("STORAGE_SIZE: %u\n", (unsigned int)size() );
for(uint32 i = ; i < size(); i++)
{
if ((i == (j*)) && ((i != (k*))))
{
if (read<uint8>(i) < 0x0F)
{
printf("| 0%X ", read<uint8>(i) );
}
else
{
printf("| %X ", read<uint8>(i) );
} j++;
}
else if (i == (k*))
{
rpos(rpos()-); // move read pointer 16 places back
printf(" | "); // write split char for (int x = ; x < ; x++)
{
printf("%c", read<uint8>(i- + x) );
} if (read<uint8>(i) < 0x0F)
{
printf("\n0%X ", read<uint8>(i) );
}
else
{
printf("\n%X ", read<uint8>(i) );
} k++;
j++;
}
else
{
if (read<uint8>(i) < 0x0F)
{
printf("0%X ", read<uint8>(i) );
}
else
{
printf("%X ", read<uint8>(i) );
}
}
}
printf("\n");
} protected:
size_t _rpos, _wpos;
std::vector<uint8> _storage; public:
MSGPACK_DEFINE(_storage);
};
#endif
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <cassert>
//#include <msgpack.hpp>
#include "ByteBuffer.h" void print(std::string const& buf) {
for (std::string::const_iterator it = buf.begin(), end = buf.end();
it != end;
++it) {
std::cout
<< std::setw()
<< std::hex
<< std::setfill('')
<< (static_cast<int>(*it) & 0xff)
<< ' ';
}
std::cout << std::dec << std::endl;
} int main()
{
{
ByteBuffer A;
int32 a = ;
int32 b = ;
A<<a;
A<<b; std::stringstream ss;
msgpack::pack(ss, A);
print(ss.str()); // deal data ss.str() msgpack::object_handle oh =
msgpack::unpack(ss.str().data(), ss.str().size());
msgpack::object obj = oh.get();
std::cout << obj << std::endl; ByteBuffer B;
obj.convert(B);
int32 c;
int32 d;
B>>c;
B>>d; std::cout << c << " | " << d << std::endl;
} system("pause"); return ;
}

serialize data use msgpack的更多相关文章

  1. Logstash:Data转换,分析,提取,丰富及核心操作

    Logstash:Data转换,分析,提取,丰富及核心操作 Logstash plugins Logstash是一个非常容易进行扩张的框架.它可以对各种的数据进行分析处理.这依赖于目前提供的超过200 ...

  2. 玩转web之ajax(一)---使用表单的serialize()方法中文乱码解决

    有时候我们需要使用ajax提交去提交form的值,这样就需要使用serialize()去获取form的值,但这样获取的值如果有中文,会乱码,原因和解决方法如下: 原因:.serialize()自动调用 ...

  3. PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象

    PHP常用缓存方式:第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件.在需要缓存数据的时候,通过include方式引入,并使用.第二种,把需要的数据通过serialize函数序列化后直接 ...

  4. php base64_encode,serialize对于存入数据表中字段的数据处理方案

    A better way to save to Database $toDatabse = base64_encode(serialize($data)); // Save to database $ ...

  5. php serialize讲解与json性能测试

    [序列化的概念] 序列化是将对象状态转换为可保持或可传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 将对象的状态信息转换为可以存储或传输的 ...

  6. [.NET 开源] 高性能的 Swifter.MessagePack 已发布,并附带新版本的 Swifter.Json 和 Swifter.Data。

    抱歉各位朋友,由于各种私事公事,本应该在 19 年底发布的 Swifter.MessagePack 库延迟了这么久才发布,我深感抱歉. MsgPack 简介 MsgPack 一种非常轻巧的二进制数据交 ...

  7. 快速序列化组件MessagePack介绍

    简介 MessagePack for C#(MessagePack-CSharp)是用于C#的极速MessagePack序列化程序,比MsgPack-Cli快10倍,与其他所有C#序列化程序相比,具有 ...

  8. MessagePack简析

    一.MessagePack是什么 先看官方的定义:MessagePack是一种高效的二进制序列化格式.它允许您像JSON一样在多个语言之间交换数据.但是,它更快并且更小. 从官方定义中,可以有如下的结 ...

  9. 序列化 反序列化 MessagePack for C#

    阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...

随机推荐

  1. 【英语魔法俱乐部——读书笔记】 3 高级句型-简化从句&倒装句(Reduced Clauses、Inverted Sentences) 【完结】

    [英语魔法俱乐部——读书笔记] 3 高级句型-简化从句&倒装句(Reduced Clauses.Inverted Sentences):(3.1)从属从句简化的通则.(3.2)形容词从句简化. ...

  2. 《IT蓝豹》吹雪花demo,学习android传感器

    吹雪花demo,学习android传感器 吹雪花demo,学习android传感器,嘴巴对着手机底部吹一下就会出现飘着雪花效果. 算是学习android传感器效果.本例子主要是通过android.me ...

  3. 有关Select option 元素

    动态添加option元素以及option元素被选中方法: function getType() { ); shadowCoverTipAdd("加载中,请稍候.."); $.aja ...

  4. 转 Microsoft's Objective-C tech started on BlackBerryOS, Tizen

    今天看到了这个  Microsoft's Objective-C tech started on BlackBerryOS, Tizen 见原文 http://www.osnews.com/story ...

  5. 微软要支持Objective-C了

    今天的新闻,见http://www.solidot.org/story?sid=43899 更详细的见,http://arstechnica.com/information-technology/20 ...

  6. PPTP-VPN第三章——用户流量与并发数限制

    在前面两篇文章中详细介绍了pptp vpn的安装与使用,以及如何配置用户认证存入mysql数据库.本文将在前面两篇文章的基础上介绍如何对用户的流量做限制,同时限制相同账号的用户,同一时刻的在线数为1. ...

  7. linux 软件的安装与Tarball

    Linux 系统上真正认识的可执行文件其实是二进制文件 ( binary program ) shell scripts 只是利用 shell (例如 bash) 这支程序的功能进行一些判断式,而最终 ...

  8. swift 之 闭包

    一.闭包 格式:{  (  参数名:类型, 参数名:类型 ..  )   in 内容体  return  返回值   }  最完整的闭包 1.省略参数类型 {  (  参数名, 参数名..  )   ...

  9. easyui 中datagrid 点击行的事件

    $('#datagrid 的ID').datagrid({                onClickRow:function(index,data)                {        ...

  10. java web(spring mvc) 获取请求host 和 如何获取静态页的相对路径

    1.获取请求host StringBuffer url = request.getRequestURL(); String tempContextUrl = url.delete(url.length ...