msgpack使用zlib压缩数据

原创:http://blog.csdn.net/uo7801/article/details/68491302
1.下载msgpack https://github.com/msgpack/msgpack-c/tree/cpp-2.1.1
2.解压进入工程目录打开vs工程
编译生成,默认是生成静态lib
3.下载zlib https://github.com/madler/zlib/tree/v1.2.3
注:静态库只需要编译zlibstat, dll只需要编译zlibvc
4.建立新的工程包含 “msgpack.hpp” 和 “zlib.h” 添加前面的生成的两个lib
尝试使用msgpack的压缩类zbuffer,在msgpack.hpp文件里面添加 #include “msgpack/zbuffer.hpp” 和#include “msgpack/zbuffer.h”
实测序列化压缩可以,没找到解压还原的方法…尴尬
最后采用sbuffer类
pack->压缩->二进制保存
二进制读取->解压缩->upack
贴代码:

#include "stdafx.h"
#include "zlib.h"
#include "iostream"
#include "msgpack.hpp"
#include "fstream"

using namespace std;
unsigned char src[999999];
unsigned char strDst[999999]; 
unsigned char buf[999999]; 
int main()
{

    msgpack::sbuffer buffer_;
    msgpack::packer<msgpack::sbuffer>  _pack(&buffer_);
    int i=10;
    int num1=1;
    while (num1<1000)
    {
        test t1(num1,num1,num1,NULL,num1,num1);     //测试数据结构
        _pack.pack(t1);

        num1++;

    }//序列化完成
//  std::ofstream of_2("t2.dat",std::ios::binary);
//  of_2.write(buffer_.data(),buffer_.size());
//  of_2.close();


    std::ofstream of_("t1.dat",std::ios::binary);
    unsigned char *p=new unsigned char[buffer_.size()+1];
    cout<<buffer_.size()<<endl;

    unsigned long bufLen = sizeof(buf);  
    memcpy(p,buffer_.data(),buffer_.size());
    compress(buf, &bufLen,p,buffer_.size());压缩完成

    of_.write((const char*)buf,bufLen);
    of_.close();//写数据完成
    delete [] p;
    buffer_.release();

    std::ifstream is("1.dat",std::ios::binary);//读数据
    is.seekg (0, is.end);
    int n = is.tellg();
    is.seekg (0, is.beg);
    char *pp=new  char[n+1];
    is.read((char*)pp, n);
    msgpack::unpacker unpack_; 

    memcpy(src,pp,n);     
    unsigned long  dstLen = sizeof(strDst); 

    int nu = uncompress(strDst, &dstLen, src, n);//解压
    unpack_.reserve_buffer(dstLen);
    memcpy(unpack_.buffer(),strDst,dstLen);
    unpack_.buffer_consumed(dstLen);
    msgpack::unpacked result_;//unpack
    while (unpack_.next(result_))
    {
        std::cout << result_.get() << std::endl;
    }
        system("pause");
    return 0;
}

注:引入zlib库在编译工程时候要添加预处理 ZLIB_WINAPI

这里写图片描述
报错error LNK2026: 模块对于 SAFESEH 映像是不安全的,解决办法在工程配置属性,配置属性,连接器,命令行添加“/SAFESEH:NO ”

测试至此做个记录。
原创:http://blog.csdn.net/uo7801/article/details/68491302

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用msgpack进行map容器数据压缩和解压缩的示例代码: ```cpp #include <iostream> #include <map> #include <string> #include <vector> #include <msgpack.hpp> int main() { // 创建一个map容器,用于存储一些数据 std::map<std::string, std::vector<int>> myMap{ {"a", {1, 2, 3}}, {"b", {4, 5, 6}}, {"c", {7, 8, 9}}}; // 将map容器中的数据压缩为二进制格式 msgpack::sbuffer sbuf; msgpack::pack(sbuf, myMap); // 输出压缩后的二进制数据 std::cout << "压缩后的二进制数据:"; for (size_t i = 0; i < sbuf.size(); ++i) { std::cout << std::hex << (int)sbuf.data()[i] << " "; } std::cout << std::endl; // 将压缩后的二进制数据压缩为map容器 msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); msgpack::object obj = oh.get(); std::map<std::string, std::vector<int>> result; obj.convert(result); // 输出解压缩后的map容器数据 std::cout << "解压缩后的map容器数据:" << std::endl; for (const auto& item : result) { std::cout << item.first << ": [ "; for (const auto& val : item.second) { std::cout << val << " "; } std::cout << "]" << std::endl; } return 0; } ``` 输出结果如下: ``` 压缩后的二进制数据:82 a1 61 93 01 02 03 a1 62 93 04 05 06 a1 63 93 07 08 09 解压缩后的map容器数据: a: [ 1 2 3 ] b: [ 4 5 6 ] c: [ 7 8 9 ] ``` 可以看到,使用msgpack进行map容器数据压缩和解压缩非常简单,只需使用`msgpack::pack`和`msgpack::unpack`函数即可,非常方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值