3

ランレングスエンコーディングを実行するプログラムを作成しました。典型的なシナリオでは、テキストが

AAAAAABBCDEEEEGGHJ

ランレングスエンコーディングはそれを作ります

A6B2C1D1E4G2H1J1

ただし、繰り返されない文字ごとに1が追加されていました。私はそれを使ってBMPファイルを圧縮しているので、繰り返し文字の出現を示すためにマーカー「$」を配置するというアイデアを思いつきました(画像ファイルに大量の繰り返しテキストがあると仮定します)。

だからそれは次のようになります

$A6$B2CD$E4$G2HJ

現在の例では、長さは同じですが、BMPファイルには顕著な違いがあります。今、私の問題はデコードにあります。一部のBMPファイルにはパターンがあります。$<char><num>つまり$I9、元のファイルにあるため、圧縮ファイルにも同じテキストが含まれています。$I9ただし、デコードすると、9回繰り返される繰り返しIとして扱われます。したがって、間違った出力が生成されます。私が知りたいのは、元のソースと競合しないように、繰り返し文字(実行)の開始をマークするためにどの記号を使用できるかです。

4

6 に答える 6

6

圧縮ファイルの$ように、元のファイルでそれぞれをエンコードしてみませんか?$$

$および/またはbmp ファイルであまり使用されていない文字の代わりに、他の文字を使用します。

また、BMP 形式には RLE 圧縮が「組み込まれている」ことにも注意してください。このページの下部にある「画像データと圧縮」の下を参照してください。

あなたのプログラムが何のために使われているのか、それとも単なる学習のためなのかはわかりませんが、「公式」の bmp メソッドを使用した場合、圧縮された画像を表示する前に解凍する必要はありません。

于 2009-03-26T09:40:59.860 に答える
2

AAAAAABBCDEEEEGGGHJ$IIIIIIIII ==> $A6$B2CD$E4$G2HJ$$I9

データに繰り返し文字が含まれている場合は、エンコードされたデータに余分な繰り返し文字を挿入してみてください。次に、デコーダーが二重の繰り返し文字を検出すると、実際の繰り返し文字を挿入できます

$A6$B2CD$E4$G2HJ$$I9 ==> AAAAAABBCDEEEEGGGHJ$IIIIIIIII

于 2009-03-26T09:44:47.323 に答える
1

一部の文字を文字どおりに処理する必要があることを示すためにほとんどのプログラムが行うことは、定義されたエスケープ シーケンスがあることです。

たとえば、正規表現では、通常は意味を持つ特別に定義された文字を次に示します。

^[].*+{}()$

はい、あなたの楽しいドル記号文字がそこにあり、通常はend of lineを意味します。

したがって、正規表現を使用するプログラマーがこれらの文字を文字どおりに解釈するためにしなければならないことは、それらの文字をエスケープ シーケンスとして表現する必要があるということです。たとえば、 $ を行末ではなく $ として解釈するプログラマはエスケープシーケンスである\$を使用します。(1)

あなたの場合、リテラルのドル記号を\$ .(2)として圧縮ファイルに保存できます。

  1. 注意: grepはこの論理を逆にします。

  2. $$$として保存する上記の解決策は、BMP ファイルに$が実行されている場合に混乱を招きます。

于 2009-03-26T10:33:25.333 に答える
1

圧縮を開始する前に入力全体をスキャンできる余裕がある場合は、入力内で最も頻度の低い値をエスケープ値として選択できます。たとえば、次の入力があるとします。

AAAABBCCCCDDEEEEEEEFFG

エスケープ値として「G」を選択し (記号セットの一部である場合は「H」でも)、エンコードされたストリームの最初の文字がエスケープ値であるという規則を採用することができます。したがって、上記の文字列は次のようにエンコードされます。

GGA4BBGC4DDGE7FFGG

またはさらに良い:

HHA4BBHC4DDHE7FFG

「圧縮」バージョン (HD2 など) は非圧縮バージョン (DD) よりも長いため、2 つの同一の値の「実行」をエンコードしても意味がないことに注意してください。

それが役立つことを願っています!

于 2009-03-26T10:49:31.973 に答える
0

私が正しく理解していれば、問題は $ が繰り返しをマークするための記号であり、「BMP」値でもある可能性があることです?

その場合、二重の $ ('$$') 文字をマークして、'$' 文字を繰り返しとしてではなく、単一の '$' として扱う必要があることを示すことができます。これはもちろん、「$」のエンコードにコストがかかることを意味しますが (1 つではなく 2 つのシンボルを使用します)、問題は解決します。

'$' 文字を連続させたい場合は、次のようにエンコードする必要があります: $$$5 - '$$'=$ の '$' 連続を意味し、'5' - 5 回。

于 2009-03-26T09:43:19.090 に答える