2

私が作成している Android アプリでは、特定のテキストが入力されると、特定のアルゴリズムに従ってエンコードされます。次に、エンコードされたテキストをデコードできる同じアプリを含む別のデバイスにテキスト メッセージとして送信する必要があります。エンコード部分とデコード部分はうまく機能していますが、エンコードすると非常に長いString. 例えば、

「Hello World!」というテキストが表示されると、エンコードされると、以下の文字列が生成されます。

zN6xdwB8486d6I6I6T1p5B6T7N6I6x2z1reIWPTp

これはテキスト メッセージとして送信されるため、平均的なテキストでは非常に長いString. それで、このエンコードStringされたものを妥当なサイズに縮小できる方法はありますか? または、これをテキストメッセージとして(シリアル化されたJavaオブジェクト(Androidで可能な場合)または別の方法で)送信できる他の方法はありますか?

前もって感謝します。

4

5 に答える 5

2

文字列を文字数の少ない文字列に減らす一般的な方法はありません。これは直感的に理にかなっているはずです。1,000,000 個の文字列を 100,000 個の文字列にマップしようとすると、重複が発生します。

さらに、送信しているデータが何であるかを他の人に知られないようにしようとすると、別の問題が発生します。情報に基づいた暗号化の決定を行う必要があります。 独自の暗号化アルゴリズムを作成しないでください。

そのため、有益な情報を提供するには、より多くの情報が必要です。可能な文字列のサブセットを使用しますか?

于 2012-08-20T14:37:11.623 に答える
1

SMS はバイナリ データを運ぶことができるように見えるので、AES などを使用した方がよいかもしれません。おそらく、静的なもののIVとパスワードから生成されたキー(相手が共有するもの)を使用するように構成できます。送信する前に文字列をハフマン コーディングすることもできます。これにより、文字列がさらに縮小され、メッセージの最大長が 140 文字を超える可能性があります。次のようになります。

For sending:

input string --> compressed blob --> encrypted blob --> SMS
                                 |
                                  -> known encrypt params 

For receiving:

SMS --> encrypted blob --> compressed blob --> original string
                         |
   known encrypt params -^

圧縮ステップをバイパスする場合があります。一部の文字列は適切に圧縮されず、圧縮に関連するオーバーヘッドが少しあるため、状況によっては文字列が大きくなる可能性があります。

暗号化パラメーターは、暗号化された BLOB に残されている場合、オーバーヘッドを構成します。(アルゴリズム、IV、パディング スキームなど)。これらの 1 つのセットを毎回使用する場合は、それらをプログラムにハードコードするだけでよく、毎回送信する必要はありません。

于 2012-08-20T14:59:09.290 に答える
0

6ビットを必要とする26 + 26 + 10個のASCII文字があり、char(2バイト未満)を変換する可能性があります

文字列「012345678901234567890」は 21 文字または 42 バイトを使用し、long16 バイトの 2 つの連結で移行できます。

しかし、@elyashiv が言ったように、優れたアルゴリズムを使用する方が良い方法です。

編集

A-Aa-z0-9 は文字列の文字です。
これらは 6 ビットでコード化された 0->61 桁に変換できます

そのため、毎回 <<6 で long に追加できます。最後の文字 (11 番目) が分割され、2 番目の長さが始まります。

バイトで送信機を見つける必要があります。

メッセージングに文字列が必要な場合は、8 進数を使用し、最初の印刷できない文字をスキップする必要があります。そのため、7 つの数字を 1 つのロング (<<7 デカール ビットを使用) に配置できます。

于 2012-08-20T14:41:48.250 に答える
0

小さなアルゴリズムを使用して、文字列をデコードできます。

または、このような単純なアルゴリズムを実装できます

originalString = "hello";

各文字+1 例: a = b、b=c....など または

各文字 = 3 ex a = d、b = h....

encodedString ="ifmmp"

したがって、文字数はそのままになり、文字列をデコードします

于 2012-08-20T14:23:37.457 に答える