#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. ORACLE临时表空间

    ORACLE临时表空间总结 2014-10-05 11:35 by 潇湘隐者, 临时表空间概念 临 时表空间用来管理数据库排序操作以及用于存储临时表.中间排序结果等临时对象,当ORACLE里需要用到S ...

  2. 安装好oracle后,打开防火墙遇到的问题!

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 1521 -j ACCEPT -A INPUT -j REJECT --reject-with ...

  3. css3、html5学习笔记

    2016/12/14 ----认真看完绝对对你有帮助 HTML5针对移动端,移动端的浏览器主要是chrome,是webkit内核; app(applicatin):应用; native app:原生的 ...

  4. StaticPagedList

    估计是因为水平原因,之前看别人写的用pagedList分页,老是云里雾里的.下面把自己写的整理一下放在上面.这里的List为对应页面展示的内容.不用查询所有. Action: public Actio ...

  5. tesseract-ocr

    tesseract-ocr 第一课 前言 据网上介绍tesseract-ocr性能不错,并且可以支持识别中文了.于是尝试一下.   安装 1.下载地址: https://code.google.com ...

  6. 无cookie下载Oracle otn上的sun jdk等软件

    从Oracle下载sun jdk提示:In order to download products from Oracle Technology Network you must agree to th ...

  7. python 面向对象-笔记

    1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...

  8. C++ Primer Plus 笔记记录

    (一) /a 这个转移字符竟然能调用计算机的硬件 喇叭~~ 对于float c++只能保证6位有效数字 似乎 double是13位 cout.setf(ios_base::fixed, ios_bas ...

  9. Everything Be True

    function every(collection, pre) { // Is everyone being true? //return pre; for(var i in collection){ ...

  10. Handler使用总结(转)

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...