2016-11-05 8 views
0

私はC++でハフマンエンコーディングを実装しています。ハフマンツリーを正常に構築でき、文字列をエンコード/デコードできます。ハフマンコードをC++でコーディング

私がやりたいことは、ファイルをエンコード/デコードできることですが、いくつか問題があります。 私はコードワードを含むためにブールベクトルを使用しています。私の問題は次のとおりです。バイトをファイルに書き込むことしかできません。どのようにビットごとに書きますか?おそらく私が使用できるライブラリはありますか?

もう1つは、ファイルをデコードする場合、ツリー自体(またはコードテーブル)が必要なことです。ツリーを直列化する最良の方法は何ですか?

ご協力いただければ幸いです。

+0

2つの選択肢があります。ビットをバイトにエンコードします。または1ビットあたり1バイトを使用します。 –

+0

これはフォーマットの仕様なので、あなたが望むことをしてください。ビットをきつくパックしたい場合は、一度に8ビットを書き込むビットベクタを結合します。コードをバイト単位で書きたい場合は、それを行います。ツリーを配列(ツリートラバーサルを見る)またはエッジリストにして、好きなように書くことができます。あまりにも多くのオプションがあります。あなたが既に持っているものを実際に指定していないので... – BeyelerStudios

+0

2番目の問題については、基本的に3つの方法しかありません(https://en.wikipedia.org/wiki)。/Tree_traversal)。一つを選ぶ。そして、 "表示"の代わりに、ツリーをディスクに書き出します。ファイルを読むときは逆にしてください。 –

答えて

2

C++のboolベクタの内部形式は、既にパックされている可能性が非常に高いため、未定義です。

とにかく、<<,>>、および&演算子を使用して、エンコード側のバイトにビットをパックし、デコード側のビットをアンパックします。バイトが8ビットで構成されていることを知っていると仮定すると、これは簡単ではありません。

ハフマンコードの送信に関しては、標準ハフマンコードについて読んでください。コードを送信する必要はありません。各シンボルのビット数だけのコード長です。より効率的にするために、ランレングスおよびハフマン符号化を用いて、長さのシーケンス自体を圧縮することができます。例については、Deflate formatを参照してください。

+1

ハフマン教授からの死後の回答を得ることができないのは、その分野の専門家をもっと熟知していると考えるのは難しいです... –

関連する問題