У меня есть метод
private static String DecompressAndDecode(byte[] data)
{
GZipStream decompressor = new GZipStream(new MemoryStream(data), CompressionMode.Decompress);
StreamReader decompressed = new StreamReader(decompressor, Encoding.UTF8);
String result = decompressed.ReadToEnd();
return result;
}
У меня есть некоторый текст GZipped, как введено, и результатом, как предполагается, является Строковое представление этого текста. Проблема состоит в том, что метод возвращает пустую строку. То, что является озадачивающим меня, - то, что, когда я ступаю канавка метод в режим отладки и достигаю оператора возврата, переменная результата является пустой строкой, но если я создаю часы для распакованного. ReadToEnd () выражение это возвращает меня текст. То, что я ожидал бы в этой точке, является переменной результата для содержания текста и распакованного. ReadToEnd () оценка выражения к пустой строке. (Переоценка распакованного. ReadToEnd () выражение возвращает пустую строку как ожидалось).
@Edit: Я нашел, что в моем случае ReadToEnd () возвращает текст на втором вызове, возвращая пустые строки на первом вызове и после второго вызова.
Должно быть что-то очевидное, которое я пропускаю здесь.
Я думаю, что ваша проблема заключается в положении указателя в паре. Каждый раз, когда вы выполняете ReadToEnd
, указатель устанавливается в конец, вот почему вы можете смотреть его в первый раз.
Выполните следующий код перед ReadToEnd
, чтобы установить указатель на начало.
someStream.Seek(0, SeekOrigin.Begin)
"Должно быть, есть что-то очевидное, что я упускаю." - возможно, и я тоже ;-)
.
Давайте начнем с небольшого самодостаточного примера и посмотрим, чем он отличается от вашего реального кода.
class SOTest
{
private static String DecompressAndDecode(byte[] data)
{
GZipStream decompressor = new GZipStream(new MemoryStream(data), CompressionMode.Decompress);
StreamReader decompressed = new StreamReader(decompressor, Encoding.UTF8);
String result = decompressed.ReadToEnd();
return result;
}
private static byte[] foo(string data)
{
MemoryStream dest = new MemoryStream();
using (GZipStream compressor = new GZipStream(dest, CompressionMode.Compress))
{
using (StreamWriter sw = new StreamWriter(compressor))
{
sw.Write(data);
}
}
return dest.GetBuffer();
}
static void Main()
{
System.Console.WriteLine(
DecompressAndDecode(foo("Mary had a little lamb."))
);
return;
}
}
printsУ Марии был маленький ягненок.