serialize data use msgpack
#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的更多相关文章
- Logstash:Data转换,分析,提取,丰富及核心操作
Logstash:Data转换,分析,提取,丰富及核心操作 Logstash plugins Logstash是一个非常容易进行扩张的框架.它可以对各种的数据进行分析处理.这依赖于目前提供的超过200 ...
- 玩转web之ajax(一)---使用表单的serialize()方法中文乱码解决
有时候我们需要使用ajax提交去提交form的值,这样就需要使用serialize()去获取form的值,但这样获取的值如果有中文,会乱码,原因和解决方法如下: 原因:.serialize()自动调用 ...
- PHP使用serialize和json_encode序列化数据并通过redis缓存文件和$GLOGALS缓存资源对象
PHP常用缓存方式:第一种,把需要缓存的数据进行处理,形成PHP可以直接执行的文件.在需要缓存数据的时候,通过include方式引入,并使用.第二种,把需要的数据通过serialize函数序列化后直接 ...
- php base64_encode,serialize对于存入数据表中字段的数据处理方案
A better way to save to Database $toDatabse = base64_encode(serialize($data)); // Save to database $ ...
- php serialize讲解与json性能测试
[序列化的概念] 序列化是将对象状态转换为可保持或可传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据. 将对象的状态信息转换为可以存储或传输的 ...
- [.NET 开源] 高性能的 Swifter.MessagePack 已发布,并附带新版本的 Swifter.Json 和 Swifter.Data。
抱歉各位朋友,由于各种私事公事,本应该在 19 年底发布的 Swifter.MessagePack 库延迟了这么久才发布,我深感抱歉. MsgPack 简介 MsgPack 一种非常轻巧的二进制数据交 ...
- 快速序列化组件MessagePack介绍
简介 MessagePack for C#(MessagePack-CSharp)是用于C#的极速MessagePack序列化程序,比MsgPack-Cli快10倍,与其他所有C#序列化程序相比,具有 ...
- MessagePack简析
一.MessagePack是什么 先看官方的定义:MessagePack是一种高效的二进制序列化格式.它允许您像JSON一样在多个语言之间交换数据.但是,它更快并且更小. 从官方定义中,可以有如下的结 ...
- 序列化 反序列化 MessagePack for C#
阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...
随机推荐
- bool 类型存在数据库中为 0 和 1
bool 类型存在数据库中为 0 和 1 但是在程序中应该使用 true 和 false 查询. 例如: bIsStart = 0 在数据中bIsStart为 0 sql 查询的时候,使用:sele ...
- java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ProgressBar$SavedState
java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.Progress ...
- spring+junit单元测试
<1>读取文件: 配置文件在classes下:locations = {"classpath*:/spring/applicationContext.xml"} 配置文 ...
- navigator对象
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python积累
python积累 一.逐渐积累 python逐渐积累 http://www.cnblogs.com/lx63blog/articles/6051526.html python积累_2 http://w ...
- SQL Server 2012 通用分页存储过程
创建存储过程: USE [数据库名] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCedure [dbo].[Split ...
- Ajax调用SpringMVC ModelAndView 无返回情况
在项目中使用Ajax的时候,success中返回的data一直都是null,也没有报错.在确定Ajax语法没有错误,也没有牵扯跨域问题后,用排除法挨着删除代码,发现是因为Spring MVC会自动把方 ...
- js中判断true和false的情况
- 构造 & 析构 & 匿名对象
以前仅知道创建对象,但对匿名对象的了解基本为0. 通过阅读google chromium源代码 中关于 log 的使用,查阅相关资料,了解了一下匿名对象,予以记录. 什么是匿名对象 匿名对象可以理 ...
- 。net用lamda实现属性的优雅操作
internal class ExtensionObjectURL { internal string name { get; set; } } internal static class Exten ...