トップページ > 過去ログ > 記事閲覧
データ圧縮プログラムのソースについて
名前:プログラム1年目な人 日時: 2008/04/17 14:20

こんにちは、 「データ圧縮プログラムについてざっくり学ぶ。」のソースファイル(LzssEncode.cpp)内の変数DESTについて質問です。 コメントで 「Dest に NULL を入れると圧縮データ格納に必要なサイズが返る」とあります。 関数内では、void *Dest という引数でもらっています。 ですが if( Dest != NULL ) とアドレスで比較していますがこれで正しいのでしょうか? 何か偉そうにすみません。 教えて欲しいのでどうかよろしくお願いします。

Page: 1 |

Re: データ圧縮プログラムのソースについて ( No.1 )
名前:GPGA 日時:2008/04/17 17:35

正しいです。 >// 戻り値:圧縮後のサイズ -1 はエラー Dest に NULL を入れると圧縮データ格納に必要なサイズが返る >int LZSS_Encode( void *Src, int SrcSize, void *Dest ) ; この関数のことだと思いますが、 >Dest に NULL を入れると圧縮データ格納に必要なサイズが返る というのは、「第三引数にNULLを入れると圧縮データ格納に必要なサイズが返る」ということです。
Re: データ圧縮プログラムのソースについて ( No.2 )
名前:プログラム1年目な人 日時:2008/04/17 17:35

すみません、よく見たら解けました。 うまい言い方が判りませんが NULL っていうアドレスを引数が貰っていました。 失礼します。
Re: データ圧縮プログラムのソースについて ( No.3 )
名前:プログラム1年目な人 日時:2008/04/17 17:42

すみません更新せず、書き込んでました。 使い方についてもあやふやな面もあり一気にスッキリしました。ありがとうございます。
Re: データ圧縮プログラムのソースについて ( No.4 )
名前:プログラム1年目な人 日時:2008/04/18 15:56

厚かましくももう一つ質問です。 LzssEncode.cpp内,262行~267行目になります。 // 圧縮情報の開始を示す数値と同じだった場合は、2回連続で出力する if( SrcPoint[SrcSizeCounter] == EncodeCode ) { if( Dest != NULL )PressData[PressSizeCounter]           = SrcPoint[SrcSizeCounter] ; PressSizeCounter ++ ; } ここなのですが何故に2回連続で出力するのでしょうか? どうかよろしくお願いします。
Re: データ圧縮プログラムのソースについて ( No.5 )
名前:かたぱると 日時:2008/04/18 19:31

ソースも見ずに 「データ圧縮プログラムについてざっくり学ぶ。」 のページからの引用になりますが ▽引用開始▽  ところで、ランレングス圧縮の時は『同じ文字が2回続く』ことで圧縮 された情報かどうかを判別していましたが、LZSS圧縮ではどうやって 圧縮された情報かどうかを判別するのでしょうか?  これについては、一番登場回数が少ない文字を圧縮情報の識別子にして しまうという方法があります。(LZSS正規のものはちょっと面倒なので・・・)  先程の ABCDEFGABCDEFCDEFGH  でいうなら、H です。一回しか出てきません。  なので、  H が出てきたら、そのあとの1文字目を『何文字前からか?』の数値、 2文字目を『何文字同じか?』の数値と判断します。  で、H 自体だった場合は HH と2回続けます。ランレングス圧縮の 場合と逆です。(^^; △引用終了△ の部分のロジックではないでしょうか。
Re: データ圧縮プログラムのソースについて ( No.6 )
名前:管理人 日時:2008/04/19 22:01

2回連続で出力する理由はかたぱるとさんの仰られている通りです。
Re: データ圧縮プログラムのソースについて ( No.7 )
名前:プログラム1年目な人 日時:2008/04/23 13:29

遅くなりましたが かたぱるとさん、管理人さんありがとうございます。 何回か読んでみてようやく判りました。 何度も何度もすみませんがもう一つどうかお願いします。 圧縮かけるファイルに数値0が一度も入っていなかった場合、 LzssEncode.cpp内178行目の // 一番カウンターの値が少ない数値を圧縮情報の開始を示す数値に任命 { // 最初は仮に0番を開始を示す数値としておく EncodeCode = 0 ; MinNum = NumCounter[0] ; for( i = 1 ; i < 256 ; i ++ ) { // より出現数が低い数値が見つかったら更新 if( MinNum > NumCounter[i] ) { MinNum = NumCounter[i] ; EncodeCode = i ; } } } ファイルにない数値0が圧縮情報になりそうなのですが これで問題ないのでしょうか? よろしくお願いします。
Re: データ圧縮プログラムのソースについて ( No.8 )
名前:プログラム1年目な人 日時:2008/04/23 13:41

あ・・別に関係なかったですね。すみません。

Page: 1 |