gpt4 book ai didi

c++ - 加密和序列化 STL 字符串和其他容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:26 27 4
gpt4 key购买 nike

我在 STL 容器( vector )中有数据。 vector 中的每个节点都是一个结构,其中还包含 STL 字符串。

struct record
{
string name;
string location;
int salary;
}

vector< record > employees;

我想序列化员工,但我也想在序列化之前对其进行加密。

我的加密函数是这样的:

Encode(const char * inBfr, const int in_size, char ** outBfr, int& out_size )

通过搜索,STL 标准似乎不要求我的结构的内存是连续的,所以我不能只获取 employees 变量的内存。有没有其他聪明的方法可以将此编码功能与基于 STL 的结构/容器一起使用? Encode 函数在纯 char * 缓冲区中工作对我来说很好,所以我确切地知道进出的内容,但 STL 结构不是,我想找到一个很好的方法,以便我可以将 STL 与此函数一起使用。

如果有帮助,我也愿意使用任何其他 STL 容器。

最佳答案

虽然 std::vector<T> 中的元素保证连续布局,这并没有真正帮助:您拥有的记录可能包含填充,更重要的是,将存储 std::string std::string 之外的内容对象(在使用小字符串优化的情况下,该值可能嵌入在 std::string 中,但它还将包含几个不属于 std::string 值的字节)。因此,您最好的选择是格式化您的记录并加密格式化的字符串。

格式很简单,但我个人会将编码函数封装到一个简单的 std::streambuf 中。这样加密就可以通过过滤流缓冲区来完成。鉴于您提供的签名,这可能看起来像这样:

class encryptbuf
: public std::streambuf {
std::streambuf* d_sbuf;
char d_buffer[1024];
public:
encryptbuf(std::streambuf* sbuf)
: d_sbuf(sbuf) {
this->setp(this->d_buffer, this->d_buffer + sizeof(this->d_buffer) - 1);
}
int overflow(int c) {
if (c != std::char_traits<char>::eof()) {
*this->pptr() = std::char_traits<char>::to_char_type(c);
this->pbump(1);
}
return this->pubsync()? std::char_traits<char>::eof(): std::char_traits<char>::not_eof(c);
}
int sync() {
char* out(0);
int size(0);
Encode(this->pbase(), this->pptr() - this->pbase(), &out, size);
this->d_sbuf->sputn(out, size);
delete[] out; // dunno: it seems the output buffer is allocated but how?
this->setp(this->pbase(), this->epptr());
return this->d_sbuf->pubsync();
}
};

int main() {
encryptbuf sbuf(std::cout.rdbuf());
std::ostream eout(&sbuf);
eout << "print something encoded to standard output\n" << std::flush;
}

现在,为您的记录创建一个输出操作符,只打印到 std::ostream可用于创建编码的

关于c++ - 加密和序列化 STL 字符串和其他容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12716990/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com