• 締切済み

データを圧縮したい

0或いは1が512個連続するビットパターンがあります。 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 のようなのです。 これを eYLfJXkQiS6{m"mMtI;|l"dajI.| YBCy/`usySwXm7n95(ad#oj6m7K5A:kRY5SC.)4}EvHND5R8a まで圧縮できました。 もっと圧縮する方法はありますか? テキストファイル(データ)しばりでお願いします。 これぞという回答お待ちしています。

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.19

今回の要件をまとめると 要件1.512ビット(=64バイト)の任意のバイナリデータがある。 要件2.これをテキストファイル用の文字で表示したい。 テキストファイル用の文字とは、文字コードが16進数で0x20(スペース)から0xFE(チルダ) の範囲の95文字である。 要件3.現在78文字で表示可能であるが、77文字以下で表示可能な方法がないか。 ということでしょうか。 もし、要件2で、さらに使用可能な文字があるなら、その文字を追加して使用すれば、さらに 小さくなりますが、95文字が前提なら、78文字より小さくする方法はありません。 (64バイトの任意データを95進数で表示すると78桁となる。) 但し、 前提4.特定のデータについては、77文字以内で、それ以外のデータは78文字で表示できれば良い。 ということであれば、以下のようにして、特定のデータのみ小さくすることは可能です。 1.64バイトデータを良く知られた方法で圧縮する。(例:zip形式等) 2.それが63バイト以内に圧縮された場合は、95進数で変換。(結果は必ず77バイト以内になる) 3.63バイト以内にならない場合は、圧縮前のデータを95進数に変換。(結果は必ず78バイトになる) 4.復元時は、78バイトかそうでないかで、zip形式等の圧縮の有無を判定する。

bitpatarn
質問者

補足

>要件1.512ビット(=64バイト)の任意のバイナリデータがある。 512バイトのテキストデータです。(別に全角の0,1で1024バイトとかでもいいけど) >前提4.特定のデータについては、77文字以内で、それ以外のデータは78文字で表示できれば良い。 特定のデータかそうでないかという区別は実質できないですね。 圧縮率が高いのは法則性があるからと思いますが、法則性があると望ましくないデータなのです。(入力、出力ともに)

  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.18

ああ失礼、こんな文章なんでまともに読んでなかった。

bitpatarn
質問者

補足

お気になさらずに。

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.17
bitpatarn
質問者

補足

どうも。 金ないので買えないので、どこか落ちてないか探します 知ってたら教えてください。要約でもいいです。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.16

Shift_JISコードでいいのなら、半角カナも使えるので1バイトで95+63=158個の文字が表現可能 158^70<2^512<158^71 で、71バイトまでは圧縮できる。

bitpatarn
質問者

補足

半角カナはさすがに勘弁願います…

  • SortaNerd
  • ベストアンサー率43% (1185/2748)
回答No.14

Ascii85

bitpatarn
質問者

補足

それ78文字より小さくなるんですか?

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.13

”データ圧縮ハンドブック” トッパン M.ネルソン 著  荻原 山口 訳 古い本ですが、参考になると思います。

bitpatarn
質問者

補足

入手のあてがありません

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.12

#9です。 とりあえずいっておくと'0'と'1'の2種の文字で512文字ということはバイナリで512ビット、1バイト8ビット換算で64バイトのデータとして表せますが、64バイト程度のデータは汎用的な方法では圧縮はあんまりできませんし、それをテキスト化すると64バイトよりもたいてい増えます(一番元となる512文字よりは少ないでしょうけど)。 並びに何か規則性があるとかならまた違いますが。

bitpatarn
質問者

補足

ですね。 すいませんが他の回答への補足を見て頂いたうえで何か教えて頂けたら幸いです。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.11

(1) 0と1から構成される512文字の文字列を、 512ビット(64バイト)のバイナリデータに変換 (2) (1)を処理する (3) (2)をテキストの範囲の文字列に符号化して出力 ※ビット毎の処理が面倒、かつ、文字列操作が簡単なら、(1)の変換を行わないで、文字列をそのまま「512ビットのデータ」として扱う、という手段もある というのが、基本の流れです。 例の一つが #9 にある (2) : なにもしない (3) : Base64と同じ手法を使ってテキストの範囲に符号化 というものです。 (2)で何かの圧縮処理をすることで、より短い出力になる可能性はあります。 (例えば、ZIP圧縮するとか) しかし、短くなるか、かえって長くなるかは、入力に依存します。 必ず短くなる、と保証できません。 例えば。 ランレングス法という圧縮方法があります。これは、データを、1が続く数、0が続く数で表現します。 質問にあったものに適用するなら「1が512」となります。 連続するデータが多いと、圧縮率も高いのですが、0/1がランダムになっていると非常に効率が悪いです。 元と同じデータ量になったり、ランレングスの情報を加えた分元より大きくなったりもします。 (3) は、元のmビット、つまり、2進数m桁の数値を、n進数何桁で表現できるか、で長さが決まります。 上記より、最悪は512ビットです。 いわゆる16進文字列なら、 2^612 = 16^128 で128文字 Base64なら 64^85 < 2^512 <= 64^86 で86文字 ASCIIの印字可能文字(≒テキスト)は95文字なので 95^77 < 2^512 <= 95^78 で78文字 です。 つまり、データの内容に依らずに保証できるのは 「ASCIIの95文字を使った 78文字」です。 これ以上短くなるかどうかは、データの内容と(2)の処理に依存します。 処理のコストやプログラムの難易度を考えたら、「(2)の処理無しで(3)にBase64」で妥協するのがいいかもしれません。 ・余談 ビットパターンと言えば、コンピュータ内部での0/1のパターンのことを指します。「 0と1からなる文字列」ではありません。 ビットパターンは0/1の列ですので、別の値が入ったり途中で切れたりしないという意味では「0と1の連続」です。 ですが、そんなのは当り前なので、そのことを「連続」と言ったりはしません。 「0または1が連続」と言われれば「000....」「1111....」を意味するのが当然です。

bitpatarn
質問者

お礼

回答ありがとうございました。

bitpatarn
質問者

補足

>必ず短くなる、と保証できません。 保証できないとだめです。 >データの内容に依らずに保証できるのは 「ASCIIの95文字を使った 78文字」です。 やっぱこれしかないんですね。 なんか不可能な質問をしてしまったみたいですいませんでした。 >・余談 ビットパターンと言えば、コンピュータ内部での0/1のパターンのことを指します。「 0と1からなる文字列」ではありません。 ビットパターンは0/1の列ですので、別の値が入ったり途中で切れたりしないという意味では「0と1の連続」です。 ですが、そんなのは当り前なので、そのことを「連続」と言ったりはしません。 「0または1が連続」と言われれば「000....」「1111....」を意味するのが当然です。 よく分かりました。これからは「0と1で構成された文字列」と書くことにします。

  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.10

これ、結果もテキストでないとダメって言ってるのかな‥‥。 テキストの定義から必要になりそうだ。 「1」を1、「0」を0に定義すれば512ビットで済む。 7ビットASCII文字にして、0x00~0x1Fのときは8ビットに拡張して、 73文字くらいにはできるか。 提示されたのとあまり変わらないね。

bitpatarn
質問者

お礼

回答ありがとうございました。

bitpatarn
質問者

補足

>これ、結果もテキストでないとダメって言ってるのかな そうです。 処理が終わるとメモ帳が自動的に開いて結果が表示されるとか、コマンドプロンプトで実行したら結果が次の行に表示されるとかってかんじです。 >「1」を1、「0」を0に定義すれば512ビットで済む。 7ビットASCII文字にして、0x00~0x1Fのときは8ビットに拡張して、 73文字くらいにはできるか。 もう少し詳しく教えてください。 入力と表示(出力)はふつうに出来ますか? 人間が手で、普通のキーボードから入力したり、結果をコピペしてブラウザで検索したりとか。 >提示されたのとあまり変わらないね。 1文字でも少ないほうがいいので、教えてください。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.9

あなたが質問されたい事が 「文字の'0'と'1'で構成された512文字を効率よく圧縮する方法はありませんか。ただし圧縮後はASCII文字のテキストで表現できる形式でお願いします。」 という事なら、 圧縮ではないですが、どんなパターンでもASCII文字86文字のテキストにする方法でよければあります。 ・6文字を1つの単位としてASCII文字を1文字割り当てる。 ・6文字を1つの単位にすると512文字の場合、2文字あまるのでその2文字には'0'を4文字追加して6文字にする。 ・ACSII文字の割り当てはbase64を参考に次のようにする。 000000 A 000001 B 000002 C ... 111111 / この方法だと質問に書かれている'1'が512文字のパターンは /////////////////////////////////////////////////////////////////////////////////////w になります。

bitpatarn
質問者

お礼

回答ありがとうございました。

bitpatarn
質問者

補足

>「文字の'0'と'1'で構成された512文字を効率よく圧縮する方法はありませんか。ただし圧縮後はASCII文字のテキストで表現できる形式でお願いします。」 もうすこし条件が付きますがそういうことです >どんなパターンでもASCII文字86文字のテキストにする方法でよければ それだったら最初に質問に書いたののほうが少ないので。 でも考えてくれてありがとうございました。

関連するQ&A

  • 線形写像のノルムに関する関する問題です

    線形写像A∈L(R^n,R^m) (=R^nからR^mへの線形写像全体) に対して||A||を||A||≡sup{||Ax|| : x , ||x||≦1}で定めます。 ||A||がm×n個の変数{a}ij (i=1・・・m , j=1・・・n)の連続関数となることを示す問題です。 以前にいくつかのヒントをいただいて自力で頑張ってみたのですがいまだに理解できません。どなたか証明の仕方をお願いします。 必要な場合、以下の性質が使えます。 (i) ||A||=sup{||Ax||\||x|| : x≠0 ,x∈R^n} =sup{||Ax|| : x=1 ,x∈R^n} (ii) A∈L(R^n,R^m), B∈L(R^m,R^l) であるとき||BA||≦||B||||A|| (iii) A∈L(R^n,R^m),の標準基底に関する表現行列を(a_ij) (i↓1,・・・,m ; j→1,・・・,n)とするとき   maxΣa^2_ij≦||A||^2≦ΣΣa^2_ij (i=1,・・・,m ; j=1,・・・,n)

  • 線形写像のノルムに関する関する問題です。

    線形写像A∈L(R^n,R^m) (=R^nからR^mへの線形写像全体) に対して||A||を||A||≡sup{||Ax|| : x∈R^n , ||x||≦1}で定める。 ||A||はm×n個の変数{a}ij (i=1・・・m , j=1・・・n)の連続関数となることを示せ。 さっぱりわからないのでどなたか証明の仕方をお願いします。

  • a,bは互いに素な正の整数とする。

    a,bは互いに素な正の整数とする。 1、kを整数とするとき、akをbで割った余りをr(k)で表す。k,lをb-1以下の正の整数とするとき、k≠lならばr(k)≠r(l)であることを示せ。 2、am+bn=1を満たす整数m,nが存在することを示せ。 という問題ですが、どう考えたらよいのか分かりません…。 1の方は、akとalをそれぞれbs+r(k),bt+r(l)みたいに表してみたのですが、どう解いていけばよいのか…。 2もa(m-m(0))+b(n-n(0))=0,-(am(0)+bn(0))=1とおいてみたのですが…。 考え方だけでもいいので、教えて頂けたら嬉しいです。 回答宜しくお願いします。

  • コーシー列での証明の仕方は?

    [問]f(x)がRで連続、{a(n)}はコーシー列とする。f(a(n))はコーシー列になる事を示せ。 という問題なのですがこれはどうやって解けばいいのでしょうか? コーシー列とは 0<∀ε∈R,∃k∈N;k<m,n⇒|a(m)-a(n)|<ε となる数列の事です。

  • コンパクトだが長さが有限でない経路に沿った積分

    Cを複素数全体、AをCの連結開集合、 f:A→C φ:[0,1]→C ここで、φは連続でφ([0,1])⊂A さらに、任意の正数Mに対して、ある番号nと増加列0≦r(1)<r(2)<…<r(n)≦1が存在して、∑[k=1→n]|φ(r[k-1])-φ(r[k])|≧Mという条件を満たすとき、 fのf([0,1])上の積分をどのように定義するとよいでしょうか? その場合、φが区分的に微分可能だったりrectifiableだったりするときのとある程度同じような性質をもつようにできるでしょうか?

  • 既約剰余類群の証明

    1つめは剰余類の掛け算。2つめは互除法の原理がわからないので質問します。 読んでいる本では、(a,b)でaとbの最大公約数を表すことにし、(k,n)=1⇔ kとnは互いに素。 ̄0(本では0の上に ̄)を余りが0の類としています。 定義 Z/nZの部分集合 { ̄K|(k,n)=1,1≦k≦n-1}は×に対して群になっている。これを(Z/nZ)*と書き、既約剰余類とよぶ。と書かれていて。 ×に関して閉じていることを確認しましょう。nと互いに素であるk,lがあるとき、その積klもnと互いに素になります。klをnで割った商をq,余りをmとすると、 kl=qn+mと書くことができます。kl≡qn+m (mod n) ∴kl≡m (mod n)より、ここからが1つめのわからない計算です。 ̄k× ̄l= ̄m 自分は、n=10,k=3,l=9,m=7 3×9=2×10+7として3を2で割った余り、9を2で割った余りそれらの積が、7を2で割った余りに等しいかを計算したのですが、2以降3,4,5・・・nについても成り立つと思っていました。しかし、n=10,k=3,l=9,m=7のとき、3と9を3で割った余りの積0、7を3で割った余り1と両辺は一致しません。この場合 ̄k× ̄l= ̄mは3を10で割った余り、9を10で割った余りそれらの積が、7を10で割った余りに等しいかを計算したときだけ成り立つことを書いているのかがわかりません。 ̄k× ̄l= ̄mの具体的な計算を教えてください。またこの後が、2つめのわからない点です。互除法の原理 a,bを自然数とするaをbで割った余りがrのとき、(a,b)=(b,r) より(m,n)=(kl,n)=1もわかりません。m=kl-qn よりmをnで割った余りkl(klはnと互いに素)から、(m,n)=(n,kl)と考えました。kl≡m (mod n)より単純にmをklに書き換えただけとも思いました。(m,n)=(kl,n)=1を説明してください。 本では、(m,n)=(kl,n)=1よりmもnも互いに素になります。ですから、×について閉じています。と続きます。

  • 最大約数

    与えられた自然数N=(p^l)*(q^m) □で、l,mは0以上の整数について (1)Nの正の約数の個数 (2)Nの正の約数の総和 (1)上記の問題の(1)のNの正の約数の個数が(l+m+1)(l+1)(m+1)となるように□に適する条件を書く問題で 回答はp,Qの最大公約数をrとするとp/r,q/r,rは異なる素数らしいのですがどうしてrを割るのですか? (2)(1)の条件のもとで、(2)を解くと p/r=a,q/r=bとおくと N={(ar)^l}*{br}^m =(a^l)*(b^m)*r^(l+m) Nの正の約数の総和は S=((a^0)+(a^1)+…(a^l)) ((b^0)+(b^1)+…(a^m)) ((r^0)+(r^l)+…(r^(l+m))) から {1-a^(l+1)}/1-a * {1-b^(m+1)}/1-b *{1-r^(l+m+1)}/1-r になりますが 等比数列の和を利用して{1-a^(l+1)}/1-a になるそうですが(l+1)がどのようにして現れたのか分かりません。

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。

  • 青チャートp424の149の数列の問題です

    a_{n}=8n-2 , b_{n}=6n+2 に共通して現れる数を小さい順に並べた数列c_{n}を求めよ 解答;a_{l}=b_{m}とすると、8(n-2)+14=6(n-2)+14から    4(l-2)=3(m-2), l≧2, m≧2 4と3は互いに素より、kを自然数として    l-2=3(k-1),m-2=4(k-1)    (後は省略)  ここでなぜkはk-1にするのでしょうか。あとl≧2,m≧2の理由もわかりません。ご指導のほど宜しくお願いします。

  • 約数

    与えられた自然数N=(p^l)*(q^m) □で、l,mは0以上の整数について (1)Nの正の約数の個数 (2)Nの正の約数の総和 (1)上記の問題の(1)のNの正の約数の個数が(l+m+1)(l+1)(m+1)となるように□に適する条件を書く問題で 回答はp,Qの最大公約数をrとするとp/r,q/r,rは異なる素数らしいのですがどうしてrを割るのですか? 例えば2つの整数aとbの最大公約数をGとくと、a=a'G,b=b'Gとおける a'とb'は素とするとこうな考えをするのでしょうか? (2)(1)の条件のもとで、(2)を解くと p/r=a,q/r=bとおくと N={(ar)^l}*{br}^m =(a^l)*(b^m)*r^(l+m) Nの正の約数の総和は S=((a^0)+(a^1)+…(a^l)) ((b^0)+(b^1)+…(a^m)) ((r^0)+(r^l)+…(r^(l+m))) から {1-a^(l+1)}/1-a * {1-b^(m+1)}/1-b *{1-r^(l+m+1)}/1-r になることわ分かりません。

専門家に質問してみよう