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 ...
随机推荐
- Acadia Lab 6 轮盘游戏机
WRTnode 肯定不是亲生的... 果断转投Acadia —.— 不是国军不给力,奈何共军有高达 为啥不转树莓派?因为选做实验肯定有很多人用树莓派做...我抢不过他们,只能挑点冷门的蹭分_(:з」 ...
- SQL查询所有表,所有列
1.查询实例中所有数据库 select name,database_id from sys.databases 2.查询数据库中所有表select TABLE_TYPE,TABLE_NAME from ...
- MongoDB释放磁盘空间
1. 先删除旧的文档db.remove({}): 2. 从副本集中移除待清理的成员: (1) 登录副本集中的 Primary 服务器(/opt/mongo1/bin/mongo --port 2701 ...
- ZooKeeper设置ACL权限控制
ZK的节点有5种操作权限:CREATE.READ.WRITE.DELETE.ADMIN 也就是 增.删.改.查.管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)注:这5种权限中,del ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 售价249英镑 我曾经花了 ...
- eclipse中outline中图标的含义
outline: 实心的代表方法 空心的代表属性 绿色的圆表示公有public 黄色的菱形表示保护protect 红色的方形表示私有private 蓝色的三角表示default 图形后加字母S代表该属 ...
- 运用String类实现一个模拟用户登录程序
package Test; import java.util.Scanner; // 模拟用户登录程序 // 思路: // 1.用两个String类分别接收用户名和密码 // 2.判断输入的用户名和密 ...
- iOS 判断设备型号
+ (NSString*)deviceString { // 需要#import "sys/utsname.h" struct utsname systemInfo; uname( ...
- C#窗体技巧
//限制文本框只能输入数字且允许按退格键删除数字,其它键盘输入不予显示private void 文本框名_KeyPress(object sender, KeyPressEventArgs e) { ...
- linux批量复制或删除同命名规则的文件
如图所示,有多个不同后缀的文件,但他们的前缀都是"QC_TZ.impute." 此时想批量复制图中的文件的话,可以考虑用命令行 cp QC_TZ.impute.* /your/de ...