【问题标题】:c++ compress with libzpaq to char* bufferc++ 用 libzpaq 压缩到 char* 缓冲区
【发布时间】:2015-02-23 09:28:47
【问题描述】:

我有一个std::vector<short>,想用 libzpaq 从https://github.com/zpaq/zpaq/ 压缩(然后解压缩)到类似char* buffer 的东西。

但是我没有得到头文件中提到的ReaderWriter 类的概念。如何输入我的std::vector 以输出压缩的buffer

目前我有类似下面的代码。

#include <vector>
#include <string>
#include <stdio.h>
#include "libzpaq.h"

struct writer: public libzpaq::Writer {

  void put(int c) {

  }
};


struct reader: public libzpaq::Reader {

  int get() {

  }  
};


void libzpaq::error(const char* msg) { 
    fprintf(stderr, "Oops: %s\n", msg);
    exit(1);
}

int main() {


  short a[] = {2,5,8,2,4,2,2,2,6,5,4,3,4,2,2};
  std::vector<short> v(a, a+15);

  char* buffer;


  reader in;
  writer out;

  libzpaq::compress(&in, &out, "5");  

}

我不想将向量v 压缩成buffer。 (稍后再解压。)

但我不明白ReaderWriter 结构/类的概念。

文档 (http://mattmahoney.net/dc/libzpaq.3.html) 还提到了 ReaderWriter 的函数 virtual int read(char* buf, int n)virtual void write(const char* buf, int n)。我怎样才能将std::vector&lt;short&gt; 转换为char* buf 端,以获取此bufn 字节长度?

编辑 1:我在 libzpaq.h 第 1376 行找到了一个类 StringBuffer。但是类似

buffer = reinterpret_cast<char*> (&v[0]);
length = sizeof(short)*v.size();


libzpaq::StringBuffer inString, outString;

inString.read(buffer, length);

libzpaq::compress(&inString, &outString, "5");

std::cout << "size outstring: " << outString.size() << std::endl;
std::cout << "size instring: " << inString.size() << std::endl;

总是给我

size outstring: 0
size instring: 0

即使我尝试使用包含数千个随机元素的更大向量 v

【问题讨论】:

    标签: c++ vector compression buffer


    【解决方案1】:

    使用Reader,您可以逐字节访问要压缩的数据。所以std::vector&lt;short&gt; 看起来像这样。

    struct reader : public libzpaq::Reader {
        reader(const std::vector<short>& v) :
        m_v(v),
        m_offset(0) {
    
        }
        int get() {
            if (m_offset < m_v.size() * sizeof (short)) {
                return *((char*) m_v.data() + m_offset++);
            } else {
                return -1;
            }
        }
        int m_offset;
        std::vector<short> m_v;
    };
    

    Writer 应该收集Reader 的输出数据。如果你想在char 数组中收集它,我可以建议这样做。

    struct writer : public libzpaq::Writer {
        void put(int c) {
            m_buffer.push_back(c);
        }
        int size() {
            m_buffer.size();
        }
        void copy_to(char* dst) {
            memcpy(dst, m_buffer.data(), m_buffer.size());
        }
        std::vector<char> m_buffer;
    };
    

    然后调用它:

    writer w;
    reader r(v1);
    
    libzpaq::compress(&r, &w, "5");
    
    char* buffer = new char[w.size()];
    w.copy_to(buffer);
    

    如果您想使用StringBuffer,那么您应该在读取之前将一些数据写入缓冲区,这就是它返回 0 的原因。看示例:

    char* buffer = reinterpret_cast<char*> (&v[0]);
    int length = sizeof (short)*v.size();
    
    libzpaq::StringBuffer in, out1, out2;
    
    // fill buffer with source data
    in.write(buffer, length);
    
    // compress to out1
    libzpaq::compress(&in, &out1, "5");
    
    // decompress out1 to out2
    libzpaq::decompress(&out1, &out2);
    
    // check result
    short* b = (short*)out2.data();
    
    for(int i = 0; i < 15; ++i) {
        std::cout << b[i] << std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 1970-01-01
      • 2023-03-06
      • 2023-03-16
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多