无法使用sqlite3和C++解压缩从sql表中选择的压缩字符串
Cannot decompress a compressed string selected from an sql table using sqlite3 and C++
描述
我正在尝试将压缩的数据插入到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,则文本将被截断,无法再进行反向操作。
相关文章:
- 如何使用默认参数等选择模板专业化
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- QTreeView幻灯片多选后无法使用单击选择
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 在C++中,如何通过几种类型从元组中选择多个元素
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 对可变参数使用声明.如何选择正确的功能
- 如何使用c++在VS 2019上运行SQL查询
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 选择选举获胜者的程序
- 如何选择在 csv 文件中输出的位置
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 选择和修改嵌套向量中的条目的最佳实践
- PL/SQL可以将选择结果集保存到clob中
- 选择哪个选项在C++中使用sql
- 无法使用sqlite3和C++解压缩从sql表中选择的压缩字符串