用C++编码std::字符串
Encoding an std::string in C++
我编写了一个简单的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库。必应。
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 使用std::mt19937从字符串中返回一个随机单词
- 我可以重新分配/覆盖std::字符串吗
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何将这个std::字符串转换为std::基本字符串
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- std::字符串与 PCWSTR 的对话
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 使用 std::string_view 的子字符串控制台输出
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 重载 std::字符串运算符+ 用于打印枚举名称
- 从std::字符串创建OssBitString
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- C 中的特殊字符的子字符串(STD :: substr)
- 是否建议将字符串std::移动到将被覆盖的容器中
- 显式指定要写入的字符串 std::ostringstream
- 如何将uint16_t转换为宽字符串(std::wstring)
- 读取和Huffman压缩4字节二进制字符串STD C++Linux环境