Advertisement
Serginio

Untitled

May 18th, 2016
1,891
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.63 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.IO.Compression;
  5. using System.IO;
  6. using System.Net.Sockets;
  7. namespace TCPConnectTo1C
  8. {
  9.     public class  ДляОбменаПоТСП
  10.     {
  11.         public static readonly  Encoding CurrentEncoder=Encoding.GetEncoding(1251);
  12.  
  13.        public static  byte[] РасжатьДанные(byte[] массивДанныхДляКоманды)
  14.         {
  15.             var memStream = new MemoryStream(массивДанныхДляКоманды);
  16.             var DecompressStream = new MemoryStream();
  17.             using (GZipStream gzipStream = new GZipStream(memStream, CompressionMode.Decompress, false))
  18.             {
  19.  
  20.                 Byte[] buffer = new Byte[1 << 16];
  21.                 int h;
  22.                 while ((h = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
  23.                 {
  24.                     DecompressStream.Write(buffer, 0, h);
  25.                 }
  26.             }
  27.             return DecompressStream.ToArray();
  28.         }
  29.  
  30.         public static byte[] СжатьДанные(byte[] Value)
  31.         {
  32.             var memStream = new MemoryStream();
  33.             memStream.Position = 0;
  34.             using (GZipStream gzipStream = new GZipStream(memStream, CompressionMode.Compress))
  35.             {
  36.                 gzipStream.Write(Value, 0, Value.Length);
  37.                 gzipStream.Flush();
  38.             }
  39.             return memStream.ToArray();
  40.  
  41.        
  42.         }
  43.         private static byte[] МассивБайтовИзСтрима(NetworkStream стрим, int размерМассива)
  44.         {
  45.             byte[] result = new byte[размерМассива];
  46.             int количествоСчитанныхСимволов = 0;
  47.             while (размерМассива > количествоСчитанныхСимволов)
  48.             {
  49.                 количествоСчитанныхСимволов += стрим.Read(result, количествоСчитанныхСимволов, размерМассива - количествоСчитанныхСимволов);
  50.             }
  51.  
  52.             return result;
  53.         }
  54.  
  55.         public static void ЗаписатьМассивБайтовВСтрим(NetworkStream стрим, byte[] Массив)
  56.         {
  57.  
  58.             стрим.Write(Массив, 0, Массив.Length);
  59.         }
  60.  
  61.         public static bool ReadBool(NetworkStream стрим)
  62.         {
  63.             return BitConverter.ToBoolean(МассивБайтовИзСтрима(стрим,1), 0);
  64.         }
  65.  
  66.         public static void Write(NetworkStream стрим, bool Value)
  67.         {
  68.             ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value));
  69.        
  70.         }
  71.         public static Int32 ReadInt32(NetworkStream стрим)
  72.         {
  73.             return BitConverter.ToInt32(МассивБайтовИзСтрима(стрим,4), 0);
  74.         }
  75.  
  76.         public static void Write(NetworkStream стрим, Int32 Value)
  77.         {
  78.             ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value));
  79.  
  80.         }
  81.         public static string ReadString(NetworkStream стрим)
  82.         {
  83.          int РазмерДанных=ReadInt32(стрим);
  84.          if (РазмерДанных == 0) return "";
  85.             var данные=МассивБайтовИзСтрима(стрим,РазмерДанных);
  86.  
  87.             return CurrentEncoder.GetString(данные, 0, данные.Length);
  88.         }
  89.  
  90.         public static void Write(NetworkStream стрим, string Value)
  91.         {
  92.             if (Value.Length == 0)
  93.             {
  94.                 Write(стрим, 0);
  95.                 return;
  96.             }
  97.             byte[] result = CurrentEncoder.GetBytes(Value);
  98.             Write(стрим, result.Length);
  99.             ЗаписатьМассивБайтовВСтрим(стрим,result);
  100.  
  101.         }
  102.         public static string ReadCompressedString(NetworkStream стрим)
  103.         {
  104.           //  int РазмерДанных = ReadInt32(стрим);
  105.            // return CurrentEncoder.GetString(МассивБайтовИзСтрима(стрим, РазмерДанных));
  106.             bool ЭтоСжатаяСтрока = ReadBool(стрим);
  107.  
  108.             if (!ЭтоСжатаяСтрока) return ReadString(стрим);
  109.  
  110.             int РазмерДанныхДляКоманды = BitConverter.ToInt32(МассивБайтовИзСтрима(стрим, 4), 0);
  111.             byte[] массивДанныхДляКоманды = МассивБайтовИзСтрима(стрим, РазмерДанныхДляКоманды);
  112.             массивДанныхДляКоманды = РасжатьДанные(массивДанныхДляКоманды);
  113.             return CurrentEncoder.GetString(массивДанныхДляКоманды, 0, массивДанныхДляКоманды.Length);
  114.  
  115.         }
  116.  
  117.         public static void WriteCompressedString(NetworkStream стрим, string Value)
  118.         {
  119.             if (Value.Length == 0)
  120.             {
  121.                 Write(стрим, false);
  122.                 Write(стрим, 0);
  123.                 return;
  124.             }
  125.  
  126.  
  127.             byte[] result = CurrentEncoder.GetBytes(Value);
  128.             var СжатыеДанные=СжатьДанные(result);
  129.             if (result.Length>СжатыеДанные.Length)
  130.             {
  131.             Write(стрим, true);
  132.             Write(стрим, СжатыеДанные.Length);
  133.             ЗаписатьМассивБайтовВСтрим(стрим,СжатыеДанные);
  134.             }
  135.             else
  136.             {
  137.             Write(стрим, false);
  138.             Write(стрим, result.Length);
  139.             ЗаписатьМассивБайтовВСтрим(стрим,result);
  140.             }
  141.            
  142.  
  143.         }
  144.  
  145.         public static void ОтправтьКоманду(NetworkStream strim,string Команда, string ДанныеДляКоманды, bool ЕстьОтвет)
  146.         {
  147.            Write(strim,ЕстьОтвет);
  148.            Write(strim,Команда);
  149.            WriteCompressedString(strim,ДанныеДляКоманды);
  150.         }
  151.  
  152.         public static void ПринятьКоманду(NetworkStream strim, out string Команда, out string ДанныеДляКоманды, out bool ЕстьОтвет)
  153.         {
  154.            ЕстьОтвет=ReadBool(strim);
  155.            Команда=ReadString(strim);
  156.            ДанныеДляКоманды=ReadCompressedString(strim);
  157.         }
  158.     }
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement