Во-первых, я не думаю, что фрагмент допустим, поскольку DownloadString возвращает (как и ожидалось) строку.
Теперь, правильно ли я понимаю, что он работает правильно, когда вы используете DownloadData и неправильно, когда вы используете DownloadString? Это имеет смысл, поскольку недопустимо декодировать данные Gzip как Unicode.
РЕДАКТИРОВАТЬ:
Хорошо, ToBase64String и FromBase64String должны быть в порядке. Но если вы сможете избежать этого и напрямую передать байт [], это будет хорошо.
public static int ImportStatHistoryXML(Person tempPerson, Campus tempCampus, byte[] compressedFile) {
Тогда вы избавитесь от первой строки функции (декодирование из base64). Обратите внимание, что мы переименовываем encryptedFile в сжатый файл.
Строка:
memStream.ReadByte();
не должно быть там. Вы читаете байт и отбрасываете его. Если все так, как мы ожидаем, этот байт равен 0x1F, часть магического числа gzip.
Тогда, я думаю, вы используете неправильный класс gzip. Вы хотите GZipStream . Он построен как:
GZipStream stream = new GZipStream(memStream, CompressionMode.Decompress);
Затем вы напрямую используете StreamReader:
StreamReader sr = new StreamReader(stream);
Было бы полезно, если бы вы знали кодировку, но, надеюсь, значение по умолчанию будет правильным. Тогда это кажется правильным оттуда. Итак, в целом мы получаем ниже.
public static int ImportStatHistoryXML(Person tempPerson, Campus tempCampus, byte[] compressedFile) {
MemoryStream memStream = new MemoryStream(compressedFile);
GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress);
StreamReader sr = new StreamReader(gzStream);
string decompressed = sr.ReadToEnd();
DataSet tempSet = new DataSet();
StringReader xmlReader = new StringReader(decompressed);
tempSet.ReadXml(xmlReader);
DataTable statTable = tempSet.Tables["Stats"];
//...
}