私はGZipStream
文字列を圧縮するために使用しています.2つの異なる例を変更して、何が機能するかを確認しました. ドキュメントの例を大幅に変更した最初のコード スニペットは、単に空の文字列を返します。
public static String CompressStringGzip(String uncompressed)
{
String compressedString;
// Convert the uncompressed source string to a stream stored in memory
// and create the MemoryStream that will hold the compressed string
using (MemoryStream inStream = new MemoryStream(Encoding.Unicode.GetBytes(uncompressed)),
outStream = new MemoryStream())
{
using (GZipStream compress = new GZipStream(outStream, CompressionMode.Compress))
{
inStream.CopyTo(compress);
StreamReader reader = new StreamReader(outStream);
compressedString = reader.ReadToEnd();
}
}
return compressedString;
私がそれをデバッグするとき、私が知ることができるのは、から何も読み取られていないことだけです。reader
これcompressedString
は空です。ただし、CodeProject スニペットから変更した、私が書いた 2 番目のメソッドは成功しています。
public static String CompressStringGzip3(String uncompressed)
{
//Transform string to byte array
String compressedString;
byte[] uncompressedByteArray = Encoding.Unicode.GetBytes(uncompressed);
using (MemoryStream outStream = new MemoryStream())
{
using (GZipStream compress = new GZipStream(outStream, CompressionMode.Compress))
{
compress.Write(uncompressedByteArray, 0, uncompressedByteArray.Length);
compress.Close();
}
byte[] compressedByteArray = outStream.ToArray();
StringBuilder compressedStringBuilder = new StringBuilder(compressedByteArray.Length);
foreach (byte b in compressedByteArray)
compressedStringBuilder.Append((char)b);
compressedString = compressedStringBuilder.ToString();
}
return compressedString;
}
最初のコード スニペットは成功しないのに、もう 1 つのコード スニペットは成功するのはなぜですか? 多少の違いはありますが、2 番目のスニペットのマイナーな変更によって機能する理由がわかりません。私が使用しているサンプル文字列はSELECT * FROM foods f WHERE f.name = 'chicken';