2012-03-21 74 views
0

我写了一个简单Person类具有以下成员:编码C中的的std :: string ++

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

我打算与一个vector<Person> _contacts作为成员变量以后写AddressBook类。现在,我决定我将序列化AddressBook将写在文件中的每个联系人的编码版本,该文件将以二进制模式打开。这将主要是我将在后面分析字符串得到的值,沿着这些线路的地方:"John~Doe~42"

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

+0

很可能[Boost.Serialization](http://www.boost.org/doc/libs/1_49_0/libs/serialization/doc/index.html)和[Boost.Iostreams](http://www.boost .org/doc/libs/1_49_0/libs/iostreams/doc/index.html)最好看一下。 – 2012-03-21 05:07:26

回答

4

我想然而这串编码,是否有任何其他的方式来编码的std :: string,使其非辨认人类

人类。哪些人?

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

  • “我的傻哥哥”
  • “我的八卦,但聪明的妈妈”
  • “竞争公司”
  • “政府”。

加密打人:

  • 哥哥:(添加 'N' 每个字符)(减去 'N' 解码)
  • 母亲:(XOR的关键)
  • 公司:注意到缺少真正的加密包(例如SHA-512)
  • 政府:是的,没错。
    如果他们想从我这里得到什么,我就没有机会了。
    所以我聘请专业公司来处理它。

现在,我决定将序列地址簿是写在文件中一个单独的行这将在二进制模式打开每个接触的经编码版本。

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

这将基本上是一个字符串,我将在后面分析得到的值,沿着这些路线的话:“约翰·多伊〜〜42”

当然,但我会用' (空格)作为分隔符(因为流库已经用作默认seporator)。这将使代码更容易编写。如前所述,字符串需要用它们的长度编码(除非你有固定长度的字符串)。

因为如果我的Person类获得很多新的成员变量,则此字符串可能会变得很长。

如果你打算编码更多的信息,那么我也会添加一个版本字段。因此,您首先阅读版本号,这会告诉您接下来需要的其他字段。

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

这是没有意义的。
一切都只是一个数字。

如果不紧凑?

确定您可以压缩数据。
查找压缩算法。

+0

@rcplusplus:为你明确地拼出来,假设你需要这个用于一些真正的wrold项目你应该使用一些像SHA-X这样的加密算法,正如上面的答案中指出的那样。 – 2012-03-21 04:54:27

+0

@LokiAstari获取每个字符的ASCII值并将其转换为十六进制是否有意义?因此,例如,“猫”会变成:“63 61 74”。我会删除空格,所以它实际上看起来像这样:“0x636174”。 – rcplusplus 2012-03-21 14:42:35

+0

@你知道在内存中,'c'的值已经被存储为数字'0x63'吗? 'c'只是0x63的同义词。或者你的意思是将字符串“cat”转换为字符串“636174”?那对我'哥'而不是我的'妈妈'是有效的。 – 2012-03-21 15:56:19

0

您可以尝试异或,或添加ASCII值来抵消字符。 类似于'a'到'r','b'到's'。 这样的方法不是超强的,但人们不能直接看它并阅读它。 但对于任何严重问题,例如社会安全号码,信用卡号码,您想要使用更严肃的内容,并且要更加小心。

0

通过将XML用作文件格式,您将会处在一个更好的位置。这样,如果您决定在版本2中为您的Person类添加可选的“中间名”,则地址簿内容可以与旧版和新版本的代码向后兼容。

将数据序列化为XML,然后压缩为胜利。有很多很好的压缩库,大部分都是免费的,并且包含源代码。 zlib效果很好。

还有Boost Serialization库来看看。

大量的XML库也是如此。必应。

+0

虽然XML不是人类可读的吗? – rcplusplus 2012-03-21 14:05:11

+0

不是你用zlib压缩它之后,正如我上面所建议的那样。 – selbie 2012-03-22 05:42:57

1

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

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

Here你可以找到一个不错的介绍。