LZ法で圧縮したデータの解凍について

このQ&Aのポイント
  • LZ法で圧縮したデータの中に連続したFFの連なりが見つかり、その性質に疑問を抱いています。また、ソフトが吐き出したLZ圧縮データの情報が不明なため、解凍に困っています。
  • LZ77で圧縮したデータをバイナリエディタで解析中ですが、中間辺りに多量のFFの連なりが見つかりました。LZ法のアルゴリズムの性質上、同じデータが連なることはありえないので、疑問を感じています。
  • LZ法で圧縮したデータを解凍するためのプログラムを作成しています。しかし、ソフトが出力したLZ圧縮データの詳細情報が不明であり、スライド窓の大きさなどが分からず、解凍に苦労しています。
回答を見る
  • ベストアンサー

LZ法で圧縮したデータについて

LZ法で圧縮したデータについて 現在LZ法(LZ77)で圧縮したデータをバイナリエディタで見ております。 そのデータを解凍しなければならないため、とりあえずLZ法の圧縮/解凍プログラムを組みました。 とあるソフトが出力したデータなのですが、そこのドキュメントにはLZ77で圧縮しているという記述があります。 しかしバイナリエディタで中身を見ると、中間辺りにFF FF FF FFというFFの連なりが多量に見つかりました(20~30Byte) LZ法のアルゴリズムの性質上、同じデータが連なるというのはありえないと思うのですが、認識違いでしょうか? 私はLZ77+huffmanを使っているのでは無いかと思っています。(しかしドキュメントにはLZ77の記述しかありません) 更にLZ法は圧縮情報の持ち方に規定が無い(RFC規定に準じた圧縮アルゴリズムを除く(gzip等))為 そのソフトが吐き出したLZ圧縮が掛かっていると思われるデータについての情報が無く スライド窓の大きさのビット数などが分からないため、解凍に手を焼いています。 これはLZ法で圧縮したデータだよと言われて、只そのデータのみを渡されて それを解凍するというのは可能なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

いや…おっしゃるように、そりゃかなり無茶じゃないですか?LZ77は圧縮方式というよりはアルゴリズムでしかないわけですし、LZSSやLZMAもLZ77の一種とも言えるわけで、特定の実装を示していない。 おまけに圧縮後のヘッダサイズや圧縮のデータ構造も示していないわけですから…。 ただ、非常に単純なLZ77で圧縮した場合、FFが連続するようなことは考えられますよね。 ウィンドウサイズ限界の何倍かまで同じ文字列が繰り返し表れるような場合であれば、X文字前よりX文字分一致、というパターンが繰り返し出てくる可能性はあります。 ハフマン符号化をした場合はそういうパターンはむしろ残りにくいはずです。(文字列繰り返しがウィンドウサイズを超えているパターンが一部分にだけ固まっているということになるので、やや不自然) また、圧縮前のファイル形式が分かっていれば、先頭付近のLZ77で圧縮されない部分のデータ形式から圧縮形式の一部を推定することは可能かも知れません。 余談というか、確信のない案のひとつになりますが…。 もっとも単純な方式として考えられるのは、1Byteで区切って一致位置・一致長を表すケースですよね。FFが連続するというところからは、4bitか8bitで区切っていそうに思えます。 LZ77であるなら、FFという文字のためのエスケープと言うことはないので、圧縮後にこれが連続するようなケースを考えると良いのではないでしょうか。

MiMino2
質問者

お礼

詳しく有難うございます!! 確かに単純なLZ法ですと、同じデータが連続していればffの塊があっても不思議ではないですね。 文字列の先頭から生のデータと思われる物を見ていったりしましたが 複数を出力すると、どうも何かのヘッダのようだと思われ、正直解凍は困難を極めています。 今回は恐らく見送る方になるかと思いますが、色々と試したという実績が必要でしたので beefisdeadさんの案も大変参考になりました。 有難うございました。

関連するQ&A

  • こんな圧縮技術はある?

    例えば音声データの場合は人間に聴こえない音を削除したりして圧縮をしているかと思いますが、バイナリデータ?を書き換えて圧縮している物はあるのでしょうか? 例えば、ff EEといったデータがある場合、ffをF,eeをEに置き換える(もちろんこんな単純な物ではないでしょうが)といったものはあるのでしょうか? また、jpegなどのデータをバイナリエディタで読むと、ff,eeのような16進数が出てきますよね?それをテキストで保存して、またjpegに戻すにはどうしたらいいのでしょうか?・・というか、そういうことは可能でしょうか? よろしくお願いします。

  • jpeg画像をより小さく圧縮するために

    現在卒業研究で「画像圧縮によるホームページの高速表示」というテーマを研究しています。これは (1)自PCにサーバソフトをインストール (2)HTMLファイル内に含まれる画像ファイルを圧縮するプログラムをそれに組み込む (3)圧縮処理したHTMLファイルに解凍プログラムを添付、送信 (4)受信側でHTMLファイル内の画像を解凍、ページを表示 というのが大まかな流れです。 そこで、jpegファイルの圧縮に有効なプログラムをハフマン符号化をベースにCで作っているのですが、現在のjpegの規格に使われているハフマン符号化アルゴリズムよりもさらに圧縮率の高いプログラムを作らなければなりません。ちなみに差分値化処理は試しましたがあまり効果はありませんでした。 おおまかなご説明で構いませんので、何か有効な方法があればなにとぞご教授ください。よろしくお願いします。

  • UNIXで圧縮したgzipをWINDOWSで解凍する方法

    - UNIXで圧縮したgzip形式のファイルを、WINDOWS上で解凍して 使いたいのですが、解凍方法、若しくは、解凍ツールをご存知の方が いらっしゃいましたら、是非教えてください。 特に、gzip形式にこだわっている訳ではないので、UNIXで圧縮したファイルを WINDOWS上で解凍する方法でも構いません。 実際に使用するファイルは、ORACLEのインポートデータです。 どうぞ、どんなアドバイスでも結構です、宜しくお願いいたします。 -

  • バックアップに圧縮ソフトを使うのはマズイですか?

    絶対消えては困る画像がたくさんあって、そのバックアップにDVDーRを使用しています。でもデータ量が4.7GBちょうどあるので、4.7GBのDVDに入りません。なので、bin-tar-gzipというソフトで圧縮かけて保存しようかな?と考えてるのですが、圧縮したファイルって、壊れやすくなったりしますか? 万が一、解凍できなくなったり、解凍したファイルが開かなくなったりしたら元も子もないので、どうしたものか迷っています。 でも、2枚のDVDーRにするのも不便そうで・・・ 皆さんはどうしてますか?教えてください。

    • ベストアンサー
    • Mac
  • gzip解凍をするには

    Flashで作成した*.swfファイル内容を変更してFlashの画像を差し替えるツールの作成をしていますが、 *.swfの最初の3バイトのデータがCWSの時はヘッダーのバージョン情報以降が gzip圧縮されているようですが、このバイナリーデータを解凍できずに困っています。解凍の方法を教えてください。

    • ベストアンサー
    • PHP
  • バイナリファイルの編集

    stirling,bzなどのエディタを用いて、バイナリファイルを編集しようとしています。 テキスト(a.txt)のデータをバイナリファイルにコピペしようとしたのですが・・・ テキストで「ff ff ff ff」と書いてあったデータが、バイナリファイルにコピペすると「4646~」というように変換されてしまいました。 バイナリファイルでも「ff ff ff ff」とコピーしたい場合はどのようにすれば良いのでしょうか?

  • バイナリデータを文字に変換して圧縮もしたい

    あるバイナリデータのバックアップを印刷したいと考えています。 元のバイナリデータが2MBぐらいあるのでそれをZIP圧縮して1MBでそれをbase64で文字列に変換すると 2MBぐらいの文字列になってしまい 印刷すると150ページでした。 金庫にしまうにしても150ページでは多いのでなんとか10ページぐらいに抑えたいです。 そこで考えたのですがbase64の要領で日本語の文字列に変換することができれば印刷枚数を減らせるかと思うのですが そういった圧縮を行うライブラリってないものでしょうか? 容量は減らなくてもいいので 印刷のページ数を減らしたいです。 base64が64文字に対し日本語の文字列は5万文字?あるので大幅に減らせそうですし 小学生で習う漢字レベルだけでも1文字の情報量が100倍以上になるのでうまくいくのかなぁ?っと。 ちなみにバックアップするものは秘密鍵のような物で もちろん暗号化してクラウド等オンラインでもバックアップをしていますが 非常に重要な物のため万が一に備えて紙でも印刷して残しておき いざというときに復元できるようにしたいです。 復元する際はOCR使って さらに目視でデータ確認で数時間とか数日かかるとしても 復元したいと思うレベルのデータです。 環境はVisualStudioでC#で組もうかと思っていますが 変換と復元作業ができれば環境は問いません。 いいライブラリやアルゴリズムがあれば教えてください。 あるいは日本語文字でなくても QRコードのように印刷した紙から一定のアルゴリズムでデコードできればなんでもいいのでよろしくお願いいたします。

  • 静的ハフマンと動的ハフマンの違い

    現在、データ圧縮に少し手を出して興味が出たのですが、 符号化アルゴリズムについて理解ができていません。 そこで、 静的ハフマン符号化と動的ハフマン符号化の違いについて 知りたいと思い投稿させていただきました。 もしよろしければ、 処理的な違いやLHAなどにどちらが用いられているのか、 また、その理由についてご存知の方がいらっしゃったらご教授ください 本当に、 知識はところどころしかかじっていないので、 大まかな違いや、深いところもよろしければお願いします。

  • rarファイルとバイナリエディタについての質問

    rarファイルをダウンロードしたのですが(ファイルサイズ1GB)、いろんな解凍ソフトを使っても解凍できませんでした。極窓での拡張子判定は「?」と出ました。 そこで詳しくないのですが一応バイナリエディタをつかってみたところ、 バイナリデータがすべて00(ゼロ)になっていました。これはどういうことなのでしょうか? バイナリデータについての知識がありませんので、どなたか詳しい方にお聞きしたいと思い質問しました。どうぞよろしくお願いします。

  • 配列から指定するデータを取り出す方法

    お世話になります。 今、 char buf[1500]に値が入っているのですが、 バイナリデータであり、テキストエディタで バイナリモードでみると、 54,00,00,32,00,00,40,00,FF・・・ となっています。 この3~4バイト目の0x00,0x32のを 10進数にした値を得たいです。 今回の質問点を下記します。 (1)bufに格納されている3・4バイト目の値を得るにはどうしたら  いいのでしょうか?memcpy()などでやるのか? (2)得た値を10進にするにはどうしたらいいでしょうか? どうぞよろしくお願い致します。

専門家に質問してみよう