2009-09-18 13 views
5

QueryStringのテキストがWebサイトに表示される(C#で)メカニズムを作成したいと思います。QueryStringの約1000バイトのテキストを圧縮

たとえば、C#では文字通りのことがあります。

public void Page_Load(blah) 
{ 
     litSomething.text = Reques.QueryString["msg"]; 
} 

メッセージが英語で書かれている(UTF8がうまくいく)とし、1000文字以下であるとします。私はできるだけこのテキストを圧縮し、依然としてQueryStringに配置できるようにします。

私たちは好きなだけ多くの辞書用語を事前定義することができます。サーバーサイドのコードは、メッセージをエンコードしてデコードします。

(もちろん、私はすべての通常のXSS保護に追加されます、HttpUtitlity.HtmlEncodeなどのタイプのもの。また良いでしょう辞書情報源を解放へのポインタ!)

任意のヒント、adivce、ソースコード?あなたが尋ねる前に、これは私の宿題ではありません!

更新
ありがとうございます。私はこれをGETにしたいので、人々はIM/URLをメールします。私はbit.lyのラインに沿って考えています。それはまた、それ自体でのチートになるでしょう。しかし、これを一般的な "短文圧縮"の質問にしたいと思っていました。

+5

ヒント:

private static string Compress(string data) { using (MemoryStream ms = new MemoryStream()) { using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) { zip.Write(Encoding.UTF8.GetBytes(data), 0, data.Length); } return Convert.ToBase64String(ms.ToArray()); } } 

圧縮解除は周りだけで、他の方法は何ですか?ここでPOSTを使う... –

答えて

8

まあ、当面の問題は、次のとおりです。

  • 圧縮の結果は基本的にあなたがbase64でエンコードし、それを再び1/3大きくするであろう、それをする必要がありますので、バイナリになるだろう。 (あなたもWebセーフBase64エンコードを使用する必要があります。)
  • ませ圧縮アルゴリズムは常にテキストのサイズを縮小しません

これは、クエリで(例えば)〜1300個の文字には対応できない場合ことを意味しそれがいつもうまくいくという保証はありません。 (もし可能ならばPOSTのボディを使ってください。最初は圧縮を無視してしまうかもしれません)。

もしあなたがそれらに満足していれば、他よりも状況:

  • バイト
  • に文字列をエンコード圧縮
  • Convert.ToBase64Stringを使用してバックテキストに圧縮されたバイトを変換し(その後、ウェブ厄介な文字を置換)

反対側では、同じ変換を逆に適用します。

圧縮APIがストリームベースの場合、StreamWriterを使用すると、明示的にテキストからバイナリに明示的に変換しないようにできます。

0

メッセージがどこに由来するかによって異なります。それらがすべてあなたのものであるならば、あなたは静的な辞書を持っていて、あなたのクエリ文字列は長い文字のほんの数文字である必要があります。

私はメッセージが何かになる可能性があり、ユーザーが生成すると思います。その場合、動的に学習する方法は最も甘いでしょう。ユーザーが何を入れているのかを記録しておきましょう。珍しいがURLセーフな文字をエスケープ文字として使用して、辞書キーが表示されていることを示します。

インターネットからいくつかの単語リストを取得して、それを種蒔けることができます。 quick googleは、最も一般的な100または1000の英語の単語を見つけるはずです。

6

文字列をUTF-8としてエンコードすることで、圧縮できるバイト配列を得ることができます。その結果、あなたがそれを文字列として取得するために64ビット暗号化を使用できるように、また、バイト配列である:

private static string Decompress(string data) { 
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(data))) { 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress, true)) { 
     using (BinaryReader reader = new BinaryReader(zip)) { 
      return Encoding.UTF8.GetString(reader.ReadBytes(10000)); 
     } 
     } 
    } 
} 
関連する問題