无法使用sqlite3和C++解压缩从sql表中选择的压缩字符串

Cannot decompress a compressed string selected from an sql table using sqlite3 and C++

本文关键字:sql 选择 字符串 压缩 解压缩 sqlite3 C++      更新时间:2023-10-16

描述

我正在尝试将压缩的数据插入到sql表中,然后对其进行提取和解压缩。首先,我压缩一个字符串,然后将其插入到表中(第1节(。压缩效果良好。即使当我尝试在插入之前解压缩它时,我也会取回字符串。问题出现在插入字符串并尝试稍后将其提取回来之后。

正如您在代码的第2节中看到的那样。减压已经不起作用了。我不知道为什么我把它从桌子上取下来后它就不起作用了。


源代码

#include <zlc/zlibcomplete.hpp>
#include <string>
#include "3rdparty/sqlite_modern_cpp.h"
using namespace std;
using namespace zlibcomplete;
int main()
{
   //SECTION 1
   database db("data.db");
   db << "CREATE TABLE IF NOT EXISTS paragraph(ID INTEGER PRIMARY KEY, LINE TEXT);";
   string line = "hello world!";
   //Compress string by using zlib
   GZipCompressor compressor(9, auto_flush);
   string compressed_line = compressor.compress(line);
   compressor.finish();
   
   //IF I DECOMPRESS STRING HERE IT WORKS FINE!!!
   GZipDecompressor decompressor;
   string output = decompressor.decompress(line);
  
   //insert compressed string into table paragraph
   db <<"insert into paragraph(ID,LINE) VALUES (?,?);"
      << 1
      << compressed_line;

  //SECTION 2: Problem starts here where I try to return the compressed value
   db <<"select line from paragraph where id = ?;"
      << "1"
      >>[&](string line)
      {
        //Decompress string by using zlib
        GZipDecompressor decompressor;
        string output = decompressor.decompress(line);
        //out is empty I don't know why???
        cout << output  << endl;
      }; 
   return 0;
}

更正后更新

首先下载本解决方案中指出的base64类。

#include <zlc/zlibcomplete.hpp>
#include <string>
#include "3rdparty/sqlite_modern_cpp.h"
#include "base64.h"
using namespace std;
using namespace zlibcomplete;
int main()
{
   //SECTION 1
   database db("data.db");
   db << "CREATE TABLE IF NOT EXISTS paragraph(ID INTEGER PRIMARY KEY, LINE TEXT);";
   string line = "hello world!";
   //Compress string by using zlib
   GZipCompressor compressor(9, auto_flush);
   string compressed_line = compressor.compress(line);
   compressor.finish();
  std::string compressed = base64_encode(reinterpret_cast<const unsigned char*>(compressed_line.c_str()), compressed_line.length());
  
   //insert compressed string into table paragraph
   db <<"insert into paragraph(ID,LINE) VALUES (?,?);"
      << 1
      << compressed;

   db <<"select line from paragraph where id = ?;"
      << "1"
      >>[&](string line)
      {
        //decode HERE
        std::string compressed_decoded = base64_decode(line);
        //Decompress string by using zlib
        GZipDecompressor decompressor;
        string output = decompressor.decompress(line);
        cout << output  << endl;
      }; 
   return 0;
}

您的代码无法处理压缩字符串中的零。如果压缩字符串的字符为0,则文本将被截断,无法再进行反向操作。