2012-03-21 22 views
0

は、私は以下のメンバーでシンプルなPersonクラスを書いた:はCでのstd ::文字列をエンコード++

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

私はメンバ変数としてvector<Person> _contactsと後でAddressBookクラスを作成する予定。今のところ、AddressBookをシリアル化することは、バイナリモードで開くファイルの別の行に、各連絡先のエンコードされたバージョンを書き込むことになると判断しました。これは、基本的には、これらの行のどこかで値を取得するために後で解析する文字列になります。Personクラスに多くの新しいメンバ変数がある場合、この文字列をエンコードします。かなり長くなる。私はそれが16進表現としてコード化されることを望んでいましたが、それは非常にありそうもないので、私は質問する必要があります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)が最適です。 –

答えて

4

しかし、人間の人間によって

により、非解読作るためのstd ::文字列をエンコードする他の方法があります。どの人間?

  • "私の愚かな兄"
  • "マイノシベ島が、スマートママ"
  • "競合会社"
  • "政府":

    は個人的に私は、それらを分類します。

人を倒すために暗号化:

  • ブラザー:(各文字に 'N' を追加)(復号化するために 'N' を引く)
  • 母:(XORキー)
  • 会社:実際の暗号化パッケージ(SHA-512など)には足りないと言われています
  • 政府:そうです。
    もし彼らが私から何かを得たいなら、私はチャンスがありません。
    私はそれを扱う専門会社を雇っています。

は今のところ、私はアドレス帳はバイナリモードでオープンされるファイル内の別々の行上の各コンタクトのエンコードされたバージョンを記述することでシリアル化であろうと決定しました。

バイナリ/テキストモード実際の違いはありません。バイナリモードは、 '\ n'がEnd of Line Sequenceに/から変換されないことを意味します。

それは基本的に、私はどこかにこれらの線に沿って、値を取得するために、後で解析します文字列になります:「」

「ジョン・ドウ〜〜42」確かに、しかし、私が使用します(スペースライブラリーがすでにデフォルトセポレーターとして使用しているので)セパレーターとして(スペース)を使用します。これにより、コードを書くのがはるかに簡単になります。前述の文字列は長さでエンコードする必要があります(固定長文字列を使用している場合を除きます)。

Personクラスが多くの新しいメンバー変数を取得すると、この文字列がかなり長くなる可能性があるためです。

さらに詳しい情報をエンコードする予定がある場合は、バージョンフィールドも追加します。したがって、まずバージョン番号を読んでください。これは次に期待される他のフィールドを教えてくれます。

私はそれを16進表現

これは意味がないとして符号化することができることを期待していました。
すべては単なる数字です。

コンパクトでない場合は?

確かにデータを圧縮できます。
圧縮アルゴリズムをルックアップします。

+0

@rcplusplus:あなたのためにこれを明示的に記入してください。実際のプロジェクトではこれが必要であると仮定してください。上記の答えで指摘されているSHA-Xのような暗号アルゴリズムを使用する必要があります。 –

+0

@LokiAstari各文字のASCII値を取得して16進数に変換するのは意味がありますか?たとえば、「cat」は「63 61 74」となります。私はスペースを削除するので、実際には "0x636174"のようになります。 – rcplusplus

+0

@値 'c'はすでにメモリに格納されていることを認識していますか? 'c'は0x63の同義語です。または、文字列 "cat"を文字列 "636174"に変換することを意味しますか?それは私の「兄弟」には効くが、私の「お母さん」には作用しない。 –

0

XORを試したり、ASCII値を追加して文字をオフセットすることができます。 変換 'a'を 'r'に、 'b'を 's'に変換します。 このような方法は超強力ではありませんが、人々はそれを見て直接読むことはできません。 しかし、社会保障番号、クレジットカード番号のような深刻なものについては、より深刻なものを使用したいと思っています。

0

XMLをファイル形式として使用すると、より適切な場所に配置できます。そうすれば、バージョン2のPersonクラスにオプションの「ミドルネーム」を追加することに決めた場合、アドレス帳のコンテンツは古いコードと新しいバージョンのコードとの間で前後に互換性があります。

データをXML形式でシリアル化してから、勝利のために圧縮します。そこには多くの良い圧縮ライブラリがあり、ほとんど無料でソースも含まれています。 zlibがうまく機能します。

閲覧するライブラリはBoost Serializationです。

多くのXMLライブラリも同様です。それのためにビン。

+0

XMLは人間が読めるとは思いませんか? – rcplusplus

+0

上記のようにzlibで圧縮した後ではありません。 – selbie

1

sqliteはどうしますか? これを使用することで、データなどをシリアル化する必要はありません。バイナリファイルを作成するだけで、通常のデータベースとしてアクセスできます。

長期的には、すべてを書き直すことなく別のデータベースに接続することでアプリケーションを拡張できます。

Hereあなたは素晴らしいイントロを見つけることができます。

関連する問題