base 80を使用したファイルの圧縮


8

80ベースの番号である独自の番号付けシステムを使用してファイルサイズを圧縮したいのですが、これが可能かどうかを本当に知りたいのですか?16進数はA、B、C、D、E、Fのような記号を使用して10、11、12、13、14、15を表すことを学びました-そしてそれは私が自分の番号付けシステムにしたいのですが、より大きなスケールで。何か不足している場合は修正してください。

出来ますか ?


2
こちらもご覧ください
ラファエル

5
フランクの答えは、これがうまくいかない理由を説明しています。しかし、これはあなたが始める前にあなた自身に尋ねることができたものです:あなたが使用している80番の特別な特性は何だと思いますか?80について特別なことがなければ、アイデアが80で機能するのであれば、81の方が効果的ではないでしょうか。または801?
David Richerby 2014

3
@DavidRicherby:私はbase 80に多くの値を考えることはできませんが、base-85を使用することには実際にいくつかの本当の価値があります:4つのオクテットのグループを5つの印刷可能な文字に変換できます。ストレージ効率はbase-64(20文字はbase-64で15オクテット、base-85では16オクテットを表す)を大幅に改善するものではありませんが、基本データの「チャンク」が24ではなく32ビットであるという事実により、とても役に立ちます。
スーパーキャット2014

いくつかのパターンを見つけてシンボルで表すことができるとしたらどうでしょうか?
キナニ2014

2
パターンを見つけてそれらをシンボルで表す場合は、有効な圧縮アルゴリズムを作成したことになります(表現が元のパターンよりも短い限り)。これは、すべての圧縮アルゴリズムが機能する方法です。
Tanner Swett 2014

回答:


30

同じファイルをエンコードするために必要な80ベースの数値は2ベースの数値(ビット)よりも少なくなりますが、これらの80ベースの数値をコンピューターに格納する唯一の方法は、ビットとしてエンコードすることです。したがって、何も得られません。

実際、80は2の累乗ではないため、実際にはスペースが失われます。80ベースの数値ごとに7ビットが必要になりますが、これらの7ビットでは、直接使用すると、128の異なる状態をエンコードできます。


10

質問を解釈するにはいくつかの方法があります。私はと思うあなたが尋ねるかもしれないことは、あなたが一連の持っているということであるアルファベットで文字をΣ場所| Σ | = 80Σ|Σ|=80。これをできるだけ少ないビット数で格納する必要があります。アルファベットの文字が均一に分布していると仮定します。

ログ2|Σ|Oログ

これでかなり良いです。しかし、ランダムアクセスが必要な場合はどうでしょうか。

ログ2|Σ|O1

イェブゲニイー・ドディス、ミアイ・パトラスク、およびミッケル・ソーアップ、:ここでは紙だローカルデコード可能で算術符号化にアンオルタナティブ、STOC 2010。

ちなみに、MihaiPătraşcuという名前を覚えておいてください。彼は、現代のエヴァリストガロアに私たちが持っている最も近いものでした。彼は29歳で脳腫瘍のために非常に若くして亡くなりました。しかし、コンピューターサイエンティストとしての短いキャリアの中で、彼の研究はアルゴリズムの分析分野に革命を起こし、完全に理解するには数十年かかります。


3

あなたは番号を持っている場合は、あなたがして(例えば。123456789⏨)テキストとして、あなたは、(のような21i3v9ベース36で)異なるベースでそれを書くことができます圧縮し、それをテキストとして書かれた(9つの文字から6まで)。

さらに進むと、バイナリ(4バイト¹)で保存することになります。

さて、この作品あなたは縮小セット[0-9]で開始し、大きな1 [0-9A-Z]に移動しているためのデータのビット数は、最初の表現で未使用でした。

同様に、ファイルに文字のみが含まれていることがわかっている場合は、ベースを変更することで簡単に圧縮できます。ただし、任意のコンテンツから圧縮する場合、(常に)機能しません。一部のファイルは圧縮する(出力を小さくする)ことができますが、他のファイルは可逆圧縮方式同じように大きくなるため、これは避けられません。

ただし、たとえば、英語のテキストは十分に圧縮するが、中国語のテキストを大きくする方法は、中国語よりもはるかに多くの英語を書く場合には十分です。

¹実際には2²2ビットしか必要ありませんが、今日のコンピューターストレージは8ビットの倍数を使用しています(しかし、おそらく2²⁷ビットの一連の数値を保存したいと思いますか?☺)。


2

ベース80 ?? なぜ80?それは意味をなさないが、ベース85は意味をなす。5バイトの文字を使用して4バイトを表すことができるので非常に便利です(85 ^ 5 = 4,437,053,125は、2 ^ 32 = 4,294,967,296よりわずかに大きいため)。

これが、単一の32ビットを作成するための私のコードですword

for (i=0; i<5; i++)
{
    c = (word % 85) + 37;
    word /= 85;
    fwrite(&c, sizeof(uint8_t), 1, file);
}

そして、それを読み返すためのものです:

    word = 0;
    for (i=4; i>=0; i--)
        fread(&c[i], sizeof(uint8_t), 1, file);

    for (i=0; i<5; i++)
        word = word*85 + c[i]-37;

本当にbase 80を使用したい場合は、同じアプローチを使用して、85のインスタンスを80に置き換えることができます。4バイトごとに、5ではなく6文字が必要になります。

しかし、どのようにして何かを圧縮するのでしょうか?あなたは、ファイルがベース256で書かれていることに気づいていますか?これは、base 85で記述されたファイルをzip圧縮すると、zipされた元のbase 256ファイルとほぼ同じサイズになるため、印刷可能な文字を使用してバイナリデータを表現する場合、base 85(またはbase 64)が適切な選択肢になります。



0

他の回答で説明されているように、圧縮に関しては何も得られませんが、さまざまなベースがさまざまな目的で使用されています。

base64エンコーディングの説明については、ウィキペディアを参照してください。Base 64は、圧縮ではなく、通常は印刷不可能な文字と制御コードを生成するバイナリデータを印刷可能なASCII文字スペースにエンコードするためによく使用されます。これによりファイルサイズは大きくなりますが、XML、電子メール、CSS、Webページなど、他のASCIIファイルに埋め込むことができるバイナリデータを転送するのに役立ちます。


あなたの言うことは本当ですが、質問の答えにはなりません。
David Richerby 2014

@DavidRicherby同意しない。OPに精通しているもの以外の基数を使用することが可能であり、それらには目的がありますが、その目的は圧縮ではありません。
ルーク・ミルズ

問題は、base-80でファイルを書き込むことによってファイルを圧縮することは可能ですか?最初の文で述べたように、他のすべての回答がすでにカバーしているように、その答えは「いいえ」です。2番目の段落は、質問に関するコメントです。コメントはコメントに入れます。
David Richerby 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.