2

C#でバイト配列を文字列に変換し、再び元に戻す可能性のある重複

ここからいくつかのテキストの圧縮と解凍にハフマンコーディングを使用しています

そこにあるコードは、エンコードとデコードに使用するハフマン ツリーを構築します。コードを直接使用すると、すべて正常に動作します。

私の状況では、圧縮されたコンテンツを取得して保存し、必要に応じて解凍する必要があります。

エンコーダからの出力とデコーダへの入力はBitArrayです。

BitArray次のコードを使用してこれを変換しStringて元に戻しBitArray、デコードしようとすると、奇妙な答えが得られます。

Tree huffmanTree = new Tree();
huffmanTree.Build(input);

string input = Console.ReadLine();
BitArray encoded = huffmanTree.Encode(input);

// Print the bits
Console.Write("Encoded Bits: ");
foreach (bool bit in encoded)
{
    Console.Write((bit ? 1 : 0) + "");
}
Console.WriteLine();

// Convert the bit array to bytes
Byte[] e = new Byte[(encoded.Length / 8 + (encoded.Length % 8 == 0 ? 0 : 1))];
encoded.CopyTo(e, 0);

// Convert the bytes to string
string output = Encoding.UTF8.GetString(e);

// Convert string back to bytes
e = new Byte[d.Length];
e = Encoding.UTF8.GetBytes(d);

// Convert bytes back to bit array
BitArray todecode = new BitArray(e);

string decoded = huffmanTree.Decode(todecode);

Console.WriteLine("Decoded: " + decoded);

Console.ReadLine();

チュートリアルからの元のコードの出力は次のとおりです。

ここに画像の説明を入力

私のコードの出力は次のとおりです。

ここに画像の説明を入力

私はどこで間違った友達ですか?助けてください、よろしくお願いします。

4

2 に答える 2

4

任意のバイトを文字列に詰め込むことはできません。その概念は未定義です。変換はエンコーディングを使用して行われます。

string output = Encoding.UTF8.GetString(e);

eこの時点では単なるバイナリ ガベージであり、UTF8 文字列ではありません。そのため、UTF8 メソッドを呼び出しても意味がありません。

解決策: 文字列との間で変換および逆変換を行わないでください。これは往復しません。そもそもなんでそんなことするの?文字列が必要な場合は、base-64 や base-85 などのラウンド トリップ可能な形式を使用します。

于 2013-02-03T10:00:18.190 に答える
0

Encoding はラウンドトリップしないと確信しています。つまり、任意のバイト シーケンスを文字列にエンコードし、同じ Encoding を使用してバイトを取得し、常に同じであると期待することはできません。

生のバイトから文字列に往復して同じ生のバイトに戻すことができるようにしたい場合は、base64 エンコーディングを使用する必要があります。

http://blogs.microsoft.co.il/blogs/mneiter/archive/2009/03/22/how-to-encoding-and-decoding-base64-strings-in-c.aspx

于 2013-02-03T09:24:31.277 に答える