Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.IO.Compression;
- using System.IO;
- using System.Net.Sockets;
- namespace TCPConnectTo1C
- {
- public class ДляОбменаПоТСП
- {
- public static readonly Encoding CurrentEncoder=Encoding.GetEncoding(1251);
- public static byte[] РасжатьДанные(byte[] массивДанныхДляКоманды)
- {
- var memStream = new MemoryStream(массивДанныхДляКоманды);
- var DecompressStream = new MemoryStream();
- using (GZipStream gzipStream = new GZipStream(memStream, CompressionMode.Decompress, false))
- {
- Byte[] buffer = new Byte[1 << 16];
- int h;
- while ((h = gzipStream.Read(buffer, 0, buffer.Length)) > 0)
- {
- DecompressStream.Write(buffer, 0, h);
- }
- }
- return DecompressStream.ToArray();
- }
- public static byte[] СжатьДанные(byte[] Value)
- {
- var memStream = new MemoryStream();
- memStream.Position = 0;
- using (GZipStream gzipStream = new GZipStream(memStream, CompressionMode.Compress))
- {
- gzipStream.Write(Value, 0, Value.Length);
- gzipStream.Flush();
- }
- return memStream.ToArray();
- }
- private static byte[] МассивБайтовИзСтрима(NetworkStream стрим, int размерМассива)
- {
- byte[] result = new byte[размерМассива];
- int количествоСчитанныхСимволов = 0;
- while (размерМассива > количествоСчитанныхСимволов)
- {
- количествоСчитанныхСимволов += стрим.Read(result, количествоСчитанныхСимволов, размерМассива - количествоСчитанныхСимволов);
- }
- return result;
- }
- public static void ЗаписатьМассивБайтовВСтрим(NetworkStream стрим, byte[] Массив)
- {
- стрим.Write(Массив, 0, Массив.Length);
- }
- public static bool ReadBool(NetworkStream стрим)
- {
- return BitConverter.ToBoolean(МассивБайтовИзСтрима(стрим,1), 0);
- }
- public static void Write(NetworkStream стрим, bool Value)
- {
- ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value));
- }
- public static Int32 ReadInt32(NetworkStream стрим)
- {
- return BitConverter.ToInt32(МассивБайтовИзСтрима(стрим,4), 0);
- }
- public static void Write(NetworkStream стрим, Int32 Value)
- {
- ЗаписатьМассивБайтовВСтрим(стрим, BitConverter.GetBytes(Value));
- }
- public static string ReadString(NetworkStream стрим)
- {
- int РазмерДанных=ReadInt32(стрим);
- if (РазмерДанных == 0) return "";
- var данные=МассивБайтовИзСтрима(стрим,РазмерДанных);
- return CurrentEncoder.GetString(данные, 0, данные.Length);
- }
- public static void Write(NetworkStream стрим, string Value)
- {
- if (Value.Length == 0)
- {
- Write(стрим, 0);
- return;
- }
- byte[] result = CurrentEncoder.GetBytes(Value);
- Write(стрим, result.Length);
- ЗаписатьМассивБайтовВСтрим(стрим,result);
- }
- public static string ReadCompressedString(NetworkStream стрим)
- {
- // int РазмерДанных = ReadInt32(стрим);
- // return CurrentEncoder.GetString(МассивБайтовИзСтрима(стрим, РазмерДанных));
- bool ЭтоСжатаяСтрока = ReadBool(стрим);
- if (!ЭтоСжатаяСтрока) return ReadString(стрим);
- int РазмерДанныхДляКоманды = BitConverter.ToInt32(МассивБайтовИзСтрима(стрим, 4), 0);
- byte[] массивДанныхДляКоманды = МассивБайтовИзСтрима(стрим, РазмерДанныхДляКоманды);
- массивДанныхДляКоманды = РасжатьДанные(массивДанныхДляКоманды);
- return CurrentEncoder.GetString(массивДанныхДляКоманды, 0, массивДанныхДляКоманды.Length);
- }
- public static void WriteCompressedString(NetworkStream стрим, string Value)
- {
- if (Value.Length == 0)
- {
- Write(стрим, false);
- Write(стрим, 0);
- return;
- }
- byte[] result = CurrentEncoder.GetBytes(Value);
- var СжатыеДанные=СжатьДанные(result);
- if (result.Length>СжатыеДанные.Length)
- {
- Write(стрим, true);
- Write(стрим, СжатыеДанные.Length);
- ЗаписатьМассивБайтовВСтрим(стрим,СжатыеДанные);
- }
- else
- {
- Write(стрим, false);
- Write(стрим, result.Length);
- ЗаписатьМассивБайтовВСтрим(стрим,result);
- }
- }
- public static void ОтправтьКоманду(NetworkStream strim,string Команда, string ДанныеДляКоманды, bool ЕстьОтвет)
- {
- Write(strim,ЕстьОтвет);
- Write(strim,Команда);
- WriteCompressedString(strim,ДанныеДляКоманды);
- }
- public static void ПринятьКоманду(NetworkStream strim, out string Команда, out string ДанныеДляКоманды, out bool ЕстьОтвет)
- {
- ЕстьОтвет=ReadBool(strim);
- Команда=ReadString(strim);
- ДанныеДляКоманды=ReadCompressedString(strim);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement