用C++编码std::字符串

Encoding an std::string in C++

本文关键字:字符串 std 编码 C++      更新时间:2023-10-16

我编写了一个简单的Person类,其中包含以下成员:

std::string _fname;
std::string _lname;
int _age;

我计划稍后用vector<Person> _contacts作为成员变量编写一个AddressBook类。目前,我决定序列化AddressBook,即在文件中的一行单独写入每个联系人的编码版本,该文件将以二进制模式打开。它基本上是一个字符串,稍后我将解析它以获得值,沿着以下几行:"John~Doe~42"

但是,我想对这个字符串进行编码,因为如果我的Person类获得了许多新的成员变量,这个字符串可能会很长。我希望它可以被编码为十六进制表示,但这似乎极不可能,所以我需要问,如果不是紧凑的,有没有其他方法可以编码std::string,使其不可被人类破译?

然而,我想对这个字符串进行编码,有没有其他方法可以对std::字符串进行编码以使其不可被人类破译

人类。哪些人类?

就我个人而言,我将它们归类为:

  • "我愚蠢的兄弟"
  • "我爱管闲事但聪明的妈妈"
  • "竞争公司"
  • "政府"

加密打败人:

  • Brother:(每个字符加"N")(减去"N"进行解码)
  • 母亲:(异或一把钥匙)
  • 公司:注意到缺少真正的加密包(例如SHA-512)
  • 政府:是的
    如果他们想从我这里得到什么,我没有机会
    所以我雇了一家专业的公司来处理

目前,我决定序列化AddressBook,即在文件中的一行单独编写每个联系人的编码版本,该文件将以二进制模式打开。

二进制/文本模式没有真正的区别。二进制模式只是意味着"\n"不会转换为End of Line Sequence

它基本上是一个字符串,稍后我将解析它以获得值,沿着以下几行:"John~Doe~42"

当然,但我会使用"(空格)作为分隔符(流库已经将其用作默认分隔符)。这将使代码更易于编写。如前所述,字符串需要使用其长度进行编码(除非您有固定长度的字符串)。

因为如果我的Person类获得了许多新的成员变量,那么这个字符串可能会很长。

如果您计划稍后对更多信息进行编码,那么我也会添加一个版本字段。因此,您首先读取版本号,这将告诉接下来还有什么其他字段。

我希望它可以被编码为十六进制表示

这没有道理
一切都只是一个数字。

如果不紧凑?

当然你可以压缩数据
查找压缩算法。

使用sqlite怎么样?通过使用它,您不需要序列化数据等。您只需创建一个二进制文件,并作为常规数据库进行访问。

从长远来看,您可以通过连接到另一个数据库来扩展应用程序,而无需重写所有内容。

在这里你可以找到一个很好的介绍。

您可以尝试XOR,或者添加ASCII值来偏移字符。类似于将"a"转换为"r",将"b"转换成"s"。像这样的方法不是很强,但人们不能直接看和读。但对于任何严重的事情,比如社会安全号码、信用卡号码,你都想使用更严重的东西,并对此更加小心。

使用XML作为文件格式会让您处于更好的位置。这样,如果您决定在版本2中为Person类添加一个可选的"中间名",那么地址簿内容可以与旧版本和新版本的代码前后兼容。

将您的数据序列化为XML,然后压缩即可获胜。有很多好的压缩库,它们大多是免费的,并且包含源代码。zlib运行良好。

还有Boost序列化库可以查看

还有大量的XML库。必应。