3

私は〜30の長さのバイト配列を持っています。
このデータを次の要件を持つ複数のユーザーに渡す方法を探しています

。1。短くする必要があります。最大で約16文字です。
2.印刷可能な文字のみが受け入れられます(数字または文字のみがさらに適切です)。
3.印刷可能な出力である必要があります(ファイルに保存するか、ソケットを使用することは私が望むものではありません)。
4.(Tudorのおかげで)元の配列にデコードできるようにしたい

配列には非常にランダムなデータが含まれているため、この問題を解決するのは非常に困難です。
私は多くの圧縮方法を試しましたが、今のところ運がありません。
圧縮後、出力をできるだけ短くするために、おそらくデータを64ベースにエンコードします(より良い方法がない限り)

プロジェクトは基本的にJavaですが、他の言語で解決策がある場合は、ここでそれについて説明したいと思います。

前もって感謝します

4

4 に答える 4

1

真にランダムなデータは、デコードするのと同じ数のバイトをエンコードに使用します (それ以上ではない場合)。

データを圧縮すると、データに固有の非ランダム構造を利用して、よりランダムで小さいものを作成します。これが、すでに圧縮されたデータを圧縮するのが非常に難しい理由です。

あなたの場合、30 * 8 ビットまたは 240 ビットを 16 * 6 ビットまたは 96 ビットにエンコードしたいようです。これは、少なくとも 2.5 倍に圧縮するには、データが非常にランダムであってはならないことを意味します。毎回これだけ圧縮するのは非常に難しく、圧縮された文字列が開始時よりも大きくなる可能性が常にあります。あなたにできることは、これを起こりにくくすることだけです。

データに固有の圧縮性がない限り、可逆圧縮 (可逆圧縮) を使用することはできません。非可逆圧縮がオプションの場合でも、どの情報が失われる可能性があるかを想定する必要があります。


コードを何らかの情報と照合する必要がある場合、できることは、ランダムな一意のコードを生成し、これをデータベースへのキーとして使用することです。このアプローチを使用する利点は、生成するよりも多くの一意のキーが必要になることがなく、必要なだけ多くの情報をキーに関連付けることができるという条件で、キーを好きなだけ短くできることです。

あなたが持っている制約を考えると、これがあなたの最良の選択肢だと思います。

于 2012-09-23T14:21:20.803 に答える
1

あなたの質問(後で編集する場合):

〜30の長さのバイト配列があります。次の要件を持つ複数のユーザーにこのデータを渡す方法を探しています。

  1. 短くする必要があります..最大で約16文字です。
  2. 印刷可能な文字のみが受け入れられます (数字のみまたは文字のみがさらに適切です)。
  3. それは印刷可能な出力でなければなりません(ファイルに保存するか、ソケットを使用することは私が望むものではありません)。

配列には非常にランダムなデータが含まれているため、この問題を解読するのは非常に困難です。

回答: 「ランダム」データを含む 30 バイトの配列があるとします。それを数字とラテン文字だけの 16 文字に圧縮することはできません。

16 のラテン文字に比べて 30 バイトでは情報量が多すぎます。

ただし、できることは、Unicode のすべての印刷可能な文字など、はるかに大きなアルファベットを使用することです。正確には何文字あるのかわかりません。しかし、同じ視覚表現を持つコード ポイント (およびコード ポイントのシーケンス) もいくつかあります。必要なのは、合計で 256*256 = 65536 の異なる外見のキャラクターだけです。そうすれば、2 バイトを 1 文字にエンコードし、最大 32 バイトを 16 文字の文字列に格納できます。

ただし、この手法には圧縮が含まれていないことに注意してください。これは、同じ生データの別のエンコードにすぎません。ランダム データは圧縮できません。

于 2012-09-23T12:57:36.630 に答える
0

申し訳ありませんが、私はあなたの問題を本当によく理解できません。バイナリである 30 バイトがあり、それらを 16 バイト未満の長さの印刷可能な文字列にエンコードしたいですか? はいの場合、それは不可能だと言うでしょう...しかし、おそらく私は質問を理解していませんでした...

30 バイトが 255 の可能なすべての値を持つことができる場合、考えられるすべてのケースでそれらを 16 バイトに圧縮する方法はありません。それはJavaの問題ではなく、単なる数学です。逆に、バイトが値のサブセットを持つことができる場合は、サブセットに必要なビット数に応じて、何かできることがあります。30 バイトから 16 バイトに減らすために、ランダムなバイト シーケンスを配列内に格納する場合は、バイトあたり最大 4 ビット、つまり 16 文字のサブセットを処理できます。

于 2012-09-23T12:45:13.093 に答える
0

1文字は1バイトか2バイトだと思います。つまり、16文字= 16〜32バイトです。1 つの解決策は、独自のアルファベットを定義することです。文字をアルファベットのみに制限できる場合、1 バイトあたり 5 ビット (26 文字) しか必要ないため、5 番目のバイトごとに 8 文字を格納できます。文字を独自の仕様に変換します。デコードすると、5 ビットごとに分割されます。

于 2012-09-23T13:00:48.773 に答える