Странная ошибка при сжатии файла в GZipStream - C#

Узнай цену своей работы

Формулировка задачи:

В процессе разработки проекта возникла странная ошибка при сжатии файла.
Листинг программы
  1. class ZipStrings
  2. {
  3. //Эта функция загружает байты в строку по 2 байта в один символ ut8-16
  4. public static string get_bytes_utf16(byte[] bytes)
  5. {
  6. string res = "";
  7. for (int i = 0; i < bytes.Length; i += 2)
  8. {
  9. char a = (i == bytes.Length - 1) ? (char)(bytes[i] << 8) : (char)(bytes[i] << 8 | bytes[i + 1]);
  10. res += a;
  11. }
  12. return res;
  13. }
  14. //Эта функция выгружает байты из строки по 2 байта из символа ut8-16
  15. public static byte[] get_utf16_bytes(string utf16)
  16. {
  17. int k = ((utf16[utf16.Length - 1] & 0xff) > 0) ? 0 : 1;
  18. byte[] res = new byte[utf16.Length * 2 - k];
  19. for (int i = 0; i < utf16.Length; i++)
  20. {
  21. res[i * 2] = (byte)(utf16[i] >> 8);
  22. if (k > 0 && i == utf16.Length - 1) break;
  23. res[i * 2 + 1] = (byte)(utf16[i] & 0xff);
  24. }
  25. return res;
  26. }
  27. //Пробная функция
  28. static public void experiment(System.Windows.Forms.IWin32Window owner)
  29. {
  30. System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
  31. if (ofd.ShowDialog(owner) == System.Windows.Forms.DialogResult.OK)
  32. {
  33. FileStream fs1 = new FileStream(ofd.FileName, FileMode.Open);
  34. System.Windows.Forms.MessageBox.Show("FileStream1 Size: "+fs1.Length.ToString());
  35. FileStream fs2 = new FileStream(ofd.FileName+".fb2",FileMode.Create);
  36. string buf = string.Empty;
  37. Inflate(fs1, out buf);
  38. Deflate(fs2, buf);
  39. fs2.Close();
  40. fs1.Close();
  41. }
  42. }
  43. //Функция сжатия. Сжимает данные из потока src и загружает в строку
  44. static public void Inflate(Stream src, out string dst)
  45. {
  46. src.Seek(0, SeekOrigin.Begin);
  47. MemoryStream dsts = new MemoryStream();
  48. GZipStream gzip_str = new GZipStream(dsts, CompressionMode.Compress);
  49. byte[] buf = new byte[src.Length];
  50. src.Read(buf, 0, buf.Length);
  51. gzip_str.Write(buf, 0, buf.Length); //!!! Ошибка возникает здесь. В gzip_str попадает только 70627 байтов из буфера из 142994 необходимых.
  52. dsts.Seek(0, SeekOrigin.Begin);
  53. buf = new byte[dsts.Length];
  54. dsts.Read(buf, 0, buf.Length);
  55. dst = get_bytes_utf16(buf);
  56. }
  57. //Функция распаковки сжатых данных. Распаковывает строку в поток данных
  58. static public void Deflate(Stream dst, string src)
  59. {
  60. const int BUF_LENGTH = 100000;
  61. byte[] fileBytes = new byte[BUF_LENGTH];
  62. int bytesRead;
  63. MemoryStream srcs = new MemoryStream(get_utf16_bytes(src));
  64. GZipStream gzip = new GZipStream(srcs, CompressionMode.Decompress);
  65. while ((bytesRead = gzip.Read(fileBytes, 0, BUF_LENGTH)) > 0)
  66. dst.Write(fileBytes, 0, bytesRead);
  67. }
  68. }
Если кто знает, в чем дело, прошу помочь.

Решение задачи: «Странная ошибка при сжатии файла в GZipStream»

textual
Листинг программы
  1.             src.Seek(0, SeekOrigin.Begin);
  2.             using (var dsts = new MemoryStream(capacity:(int)src.Length))
  3.             using (var gzip = new GZipStream(dsts, CompressionLevel.Optimal))
  4.             {
  5.                 src.CopyTo(gzip, BUF_LENGTH);//Почему-то он извлекает все данные из потока src, а в gzip записывает не все! Почему?
  6.  
  7.                 dsts.Seek(0, SeekOrigin.Begin);
  8.                 dst = String.Empty;
  9.                 while ((bytesRead = dsts.Read(buf, 0, BUF_LENGTH)) > 0)<<------ вот здесь вы уже пытаетесь работать с dsts, хотя Flush для gzip еще не вызван, и данные еще не полностью переданы
  10.                     dst += get_bytes_utf16(buf, bytesRead);
  11.             }
  12.             //<<<<----- вот только здесь потоки полностью записаны

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы