#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. Play1+angularjs+bootstrap ++ (idea + livereload)

    我的web开发最强组合:Play1+angularjs+bootstrap ++ (idea + livereload) 时间 2012-12-26 20:57:26  Freewind.me原文   ...

  2. jquery each循环,

    jquery each循环,要实现break和continue的功能: break----用return false; continue --用return ture; each()函数是基本上所有的 ...

  3. FastJSON 使用

    FastJSON是一个Java语言编写的高性能,功能完善,完全支持http://json.org的标准的JSON库.多了不说了,百度一下一大把. 在此,简单的总结一下自己用过,测试过的方法. 如果使用 ...

  4. SECD machine简介

    secd machine是一种比较基础的虚拟机设计.一般是作为函数式语言的底层虚拟机. secd machine的"secd"四个字母分别指的是这种虚拟机的核心Stack, Env ...

  5. json_decode返回null 和synax error原因及处理

    $checkLogin ='[{"gdsincode":"1103293","gdsname":"鲜美来带鱼段800g" ...

  6. array_filter,匿名函数

    static function get_categoryII() { return array( array('id' => 1, 'c1id' => 1, 'name' => '1 ...

  7. wkhtmltopdf中文显示空白或者乱码方框

    中文乱码或者空白解决方法 如果wkhtmltopdf中文显示空白或者乱码方框 打开windows c:\Windows\fonts\simsun.ttc拷贝到linux服务器/usr/share/fo ...

  8. PTA Sort Three Distinct Keys

    Suppose you have an array of N elements, containing three distinct keys, "true", "fal ...

  9. leveldb 学习笔记之VarInt

    在leveldb在查找比较时的key里面保存key长度用的是VarInt,何为VarInt呢,就是变长的整数,每7bit代表一个数,第8bit代表是否还有下一个字节, 1. 比如小于128(一个字节以 ...

  10. iOS开发】canOpenURLl 和修改http请求

    控制台输出 如图是在我启动一个 Xcode + iOS 的 App 之后,控制台的输出. 这在 Xcode 时,是不会有的情况,原因是[为了强制增强数据访问安全, iOS9 默认会把所有从NSURLC ...