├── README.md ├── Eterm通讯协议.xlsx ├── SocketAgent ├── .gitignore ├── App.config ├── Properties │ └── AssemblyInfo.cs ├── Program.cs ├── SocketAgent.csproj ├── AgentServer2.cs └── AgentServer.cs ├── SocketClient ├── App.config ├── AVanaly.cs ├── Properties │ └── AssemblyInfo.cs ├── Loging.cs ├── Client.cs ├── Program.cs ├── SocketClient.csproj ├── AnalysisMachine.cs ├── ChineseToPinyin.cs └── EncodeMachine.cs ├── .gitignore ├── ETermSimulator ├── Program.cs ├── Point.cs ├── Properties │ └── AssemblyInfo.cs ├── DETRResp.cs ├── ETermSimulator.csproj ├── Eterm.cs ├── BaseResp.cs ├── ChineseToPinyin.cs └── EncodeMachine.cs ├── EtermSimulatorTest ├── obj │ └── Debug │ │ └── EtermSimulatorTest.csproj.FileListAbsolute.txt ├── Properties │ └── AssemblyInfo.cs ├── ETermSimulatorTest.csproj └── BaseRespTest.cs ├── ConsoleApp ├── Properties │ └── AssemblyInfo.cs ├── ConsoleApp.csproj ├── ChineseToPinyin.cs ├── Program.cs └── ChineseSpell.cs └── ETermSimulator.sln /README.md: -------------------------------------------------------------------------------- 1 | ETermSimulator 2 | ============== 3 | 4 | ETermSimulator 5 | -------------------------------------------------------------------------------- /Eterm通讯协议.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MudanLabs/ETermSimulator/HEAD/Eterm通讯协议.xlsx -------------------------------------------------------------------------------- /SocketAgent/.gitignore: -------------------------------------------------------------------------------- 1 | *.suo 2 | *.dll 3 | *.exe 4 | *.obj 5 | *.user 6 | *.pdb 7 | *.xml 8 | *.cache 9 | /obj 10 | /bin 11 | -------------------------------------------------------------------------------- /SocketClient/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /SocketClient/AVanaly.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace SocketClient 7 | { 8 | public class AVanaly 9 | { 10 | // 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.suo 2 | 3 | *.dll 4 | 5 | *.exe 6 | 7 | *.obj 8 | 9 | *.user 10 | 11 | *.pdb 12 | 13 | *.xml 14 | 15 | *.cache 16 | 17 | /obj 18 | /bin 19 | ETermSimulator/bin 20 | ETermSimulator/obj 21 | ConsoleApp/bin/ 22 | ConsoleApp/obj/ 23 | SocketClient/bin/ 24 | SocketClient/obj/ -------------------------------------------------------------------------------- /ETermSimulator/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace ETermSimulator 7 | { 8 | class Program 9 | { 10 | static void Main(string[] args) 11 | { 12 | ETermSimulator.Eterm e = new Eterm(); 13 | e.Connection("127.0.0.1", 350); 14 | Console.WriteLine("exit"); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /SocketAgent/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /ETermSimulator/Point.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace ETermSimulator 7 | { 8 | public struct Point 9 | { 10 | public Point(Int16 row, Int16 column) 11 | { 12 | _Row = row; 13 | _Column = column; 14 | } 15 | private Int16 _Row; 16 | public Int16 Row { get { return _Row; } private set { _Row = value; } } 17 | 18 | private Int16 _Column; 19 | public Int16 Column { get { return _Column; } private set { _Column = value; } } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /EtermSimulatorTest/obj/Debug/EtermSimulatorTest.csproj.FileListAbsolute.txt: -------------------------------------------------------------------------------- 1 | D:\Projects\ETermSimulator\EtermSimulatorTest\bin\Debug\EtermSimulatorTest.dll 2 | D:\Projects\ETermSimulator\EtermSimulatorTest\bin\Debug\EtermSimulatorTest.pdb 3 | D:\Projects\ETermSimulator\EtermSimulatorTest\obj\Debug\EtermSimulatorTest.csprojResolveAssemblyReference.cache 4 | D:\Projects\ETermSimulator\EtermSimulatorTest\obj\Debug\EtermSimulatorTest.dll 5 | D:\Projects\ETermSimulator\EtermSimulatorTest\obj\Debug\EtermSimulatorTest.pdb 6 | D:\Projects\ETermSimulator\EtermSimulatorTest\bin\Debug\ETermSimulator.exe 7 | D:\Projects\ETermSimulator\EtermSimulatorTest\bin\Debug\ETermSimulator.pdb 8 | -------------------------------------------------------------------------------- /ConsoleApp/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的常规信息通过以下 6 | // 特性集控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("ConsoleApp")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("ConsoleApp")] 13 | [assembly: AssemblyCopyright("Copyright © 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 使此程序集中的类型 18 | // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, 19 | // 则将该类型上的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("9df8b575-dc43-41d4-8568-07b3ab8c6659")] 24 | 25 | // 程序集的版本信息由下面四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 33 | // 方法是按如下所示使用“*”: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /SocketAgent/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的常规信息通过以下 6 | // 特性集控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("SocketAgent")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("SocketAgent")] 13 | [assembly: AssemblyCopyright("Copyright © 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 使此程序集中的类型 18 | // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, 19 | // 则将该类型上的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("4d60cf95-ac25-4e51-abff-7a1a7cbfb31e")] 24 | 25 | // 程序集的版本信息由下面四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 33 | // 方法是按如下所示使用“*”: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /SocketAgent/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Configuration; 2 | using System.Net; 3 | using System.Net.Sockets; 4 | 5 | 6 | namespace MDLabs.EtermSimulator.SocketAgent 7 | { 8 | class Program 9 | { 10 | static void Main(string[] args) 11 | { 12 | TcpListener agentServer = GetTcpListener(); 13 | agentServer.Start(); 14 | int collectionId = 0; 15 | while (true) 16 | { 17 | new AgentServer2(agentServer.AcceptTcpClient(), collectionId); 18 | collectionId++; 19 | } 20 | } 21 | private static TcpListener GetTcpListener() 22 | { 23 | string ip = ConfigurationManager.AppSettings["ListenerIP"]; 24 | int port = int.Parse(ConfigurationManager.AppSettings["ListenerPort"]); 25 | if (string.IsNullOrWhiteSpace(ip)) 26 | { 27 | return new TcpListener(IPAddress.Any, port); 28 | } 29 | else 30 | { 31 | return new TcpListener(IPAddress.Parse(ip), port); 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /ETermSimulator/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的常规信息通过以下 6 | // 特性集控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("ETermSimulator")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("ETermSimulator")] 13 | [assembly: AssemblyCopyright("Copyright © 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 使此程序集中的类型 18 | // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, 19 | // 则将该类型上的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("9f4be0b8-7335-4d81-96af-a0721e16638b")] 24 | 25 | // 程序集的版本信息由下面四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 33 | // 方法是按如下所示使用“*”: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /SocketClient/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的常规信息通过以下 6 | // 特性集控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("SocketClient")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Microsoft")] 12 | [assembly: AssemblyProduct("SocketClient")] 13 | [assembly: AssemblyCopyright("Copyright © Microsoft 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 使此程序集中的类型 18 | // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, 19 | // 则将该类型上的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("b726448c-8f03-4da3-99b0-529cb8163252")] 24 | 25 | // 程序集的版本信息由下面四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 33 | // 方法是按如下所示使用“*”: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /EtermSimulatorTest/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的常规信息通过以下特性集 6 | // 控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("EtermSimulatorTest")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("EtermSimulatorTest")] 13 | [assembly: AssemblyCopyright("Copyright © 2013")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 会使此程序集中的类型 18 | // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, 19 | // 请将该类型上的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("01d9a8f3-d431-4649-9fea-3b192ffa682d")] 24 | 25 | // 程序集的版本信息由以下四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 33 | // 方法是按如下所示使用“*”: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /ETermSimulator/DETRResp.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace ETermSimulator 7 | { 8 | public class DETRResp:BaseResp 9 | { 10 | public IEnumerator AirlineTicketDatas { get; set; } 11 | } 12 | public class AirlineTicketData 13 | { 14 | public string TicketCode { get; set; } 15 | public string PassengerName { get; set; } 16 | public string PassengerIDCard { get; set; } 17 | public decimal Fare { get; set; } 18 | public decimal TaxAirport { get; set; } 19 | public decimal TaxFuel { get; set; } 20 | public string ReceiptNo { get; set; } 21 | public string PnrCode { get; set; } 22 | public AirticketFlightSailData AirticketFlightSailData { get; set; } 23 | } 24 | public class AirticketFlightSailData 25 | { 26 | public string FlightCode { get; set; } 27 | public DateTime DepDate { get; set; } 28 | public string DepAirportCode { get; set; } 29 | public string ArrAirportCode { get; set; } 30 | public string Cabin { get; set; } 31 | public string FlightSailState { get; set; } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /SocketClient/Loging.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using SocketClient; 6 | 7 | namespace SocketClient 8 | { 9 | public class Loging 10 | { 11 | public string logUserName = "o77777777"; 12 | public string Password = "password"; 13 | string strworkport = "60a44cac46ab";//这个地方时登陆人的mac地址(其中的大写一律转换成小写,中间的分隔符去掉) 14 | string strport = "192.168.80.21";//这个地方可能会不一样(登陆人的ip地址) 15 | //用户名,密码应该是传递过来的 16 | public byte[] Loing() //string userName,string password(这个地方暂时先不传) 17 | { 18 | EncodeMachine machine=new EncodeMachine (); 19 | byte[] Send = machine.LogEncode(logUserName, Password, strworkport, strport); 20 | return Send; 21 | } 22 | #region 第一组测试(猜测估计没错的话,应该是测试发送数据能不能正常接收,类似于三次握手) 23 | public byte[] TestA() 24 | { 25 | byte[] firstTest = { 1, 254, 0, 17, 20, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 26 | return firstTest; 27 | } 28 | #endregion 29 | #region 第二组测试 30 | public byte[] TestB() 31 | { 32 | byte[] secondTest = { 1, 254, 0, 17, 20, 16, 0, 2, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 254, 0, 17, 20, 16, 0, 2, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 254, 0, 17, 20, 16, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0 }; 33 | return secondTest; 34 | } 35 | #endregion 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /SocketClient/Client.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Net; 6 | using System.Net.Sockets; 7 | 8 | namespace SocketClient 9 | { 10 | public class Client 11 | { 12 | public Socket client { get; set; } 13 | public void Connect() 14 | { 15 | client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立流式套接字 16 | IPAddress address = IPAddress.Parse("192.168.80.21"); 17 | int port = 350; 18 | IPEndPoint ipend = new IPEndPoint(address, port); 19 | try 20 | { 21 | client.Connect(ipend); 22 | SendOrReceive(); 23 | Console.WriteLine("连接成功!"); 24 | } 25 | catch (SocketException EX) 26 | { 27 | Console.WriteLine("未连接上"); 28 | } 29 | 30 | } 31 | 32 | public void SendOrReceive() 33 | { 34 | string wantsend = "avshacgo"; 35 | var aa=Encoding.ASCII.GetBytes(wantsend); 36 | client.Send(aa,aa.Length,SocketFlags.None); 37 | Console.WriteLine("发送信息");//发送出去的东西不知道是否已经发上上去,并且获取不到返回回来的信息。 38 | string strdata=""; 39 | 40 | while(true) 41 | { 42 | byte[] data = new Byte[2048]; 43 | int recv = client.Receive(data);//这个返回的是长度 44 | if(recv<=0) 45 | { 46 | Console.WriteLine("失败"); 47 | break; 48 | strdata = Encoding.ASCII.GetString(data, 0, recv); //这个地方获取不到信息 49 | Console.WriteLine(strdata); 50 | } 51 | 52 | } 53 | //收不到信息(是那个环节出现了问题) 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /SocketClient/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using SocketClient; 7 | using System.Net.Sockets; 8 | using System.Configuration; 9 | using System.Net; 10 | 11 | namespace SocketClient 12 | { 13 | class Program 14 | { 15 | static void Main(string[] args) 16 | { 17 | TcpClient tcp = GetTcpService(); 18 | 19 | byte[] receiveBuffer=new byte[tcp.ReceiveBufferSize]; 20 | Loging log = new Loging(); 21 | receiveBuffer = log.Loing(); 22 | tcp.GetStream().Write(receiveBuffer, 0, receiveBuffer.Length); 23 | 24 | //receiveBuffer = log.TestA(); 25 | //tcp.GetStream().Write(receiveBuffer, 0, receiveBuffer.Length); 26 | //receiveBuffer = log.TestB(); 27 | //tcp.GetStream().Write(receiveBuffer, 0, receiveBuffer.Length); 28 | 29 | // 我都把这种事情看成常态了,看来这样还真不行,女人,真得有自己的一份职业,有自己的一席之地才行啊,要不,连个家都没有,在家里还有受气,这样可真不行 30 | 31 | //EncodeMachine machine = new EncodeMachine(); 32 | //byte[] userid = { 40, 81 }; 33 | //string strinstruct = "avshacgo"; 34 | //byte[] send = machine.MakeInstruct(userid, strinstruct); 35 | //tcp.GetStream().Write(send, 0, send.Length); 36 | while (true) 37 | { 38 | //EncodeMachine machine = new EncodeMachine(); 39 | //byte[] userid = { 40, 81 }; 40 | //string strinstruct = "avshacgo";//avshacgo 41 | //byte[] send = machine.MakeInstruct(userid, strinstruct); 42 | //tcp.GetStream().Write(send, 0, send.Length); 43 | //这个地方可以弄一个登陆信息发送过去 44 | // int j = tcp.GetStream().Read(receiveBuffer, 0, ); 45 | byte[] receive = new byte[tcp.ReceiveBufferSize]; 46 | int j = tcp.GetStream().Read(receive, 0, tcp.ReceiveBufferSize); 47 | //这个地方怎么(这个地方怎么解析服务器返回回来的数据呢?) 48 | //有返回信息,读取之后返回信息 49 | if (j > 0) 50 | { 51 | for (int i = 0; i < j; i++) 52 | { 53 | Console.Write(receive[i]); 54 | } 55 | } 56 | } 57 | 58 | } 59 | //配置一个可以监听的客户端 60 | private static TcpClient GetTcpService() 61 | { 62 | string ip = "192.168.80.21"; 63 | int port = 350; 64 | return new TcpClient(ip, port); 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /ConsoleApp/ConsoleApp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {7AA5E8A8-8B3E-4290-ABEE-466718342876} 8 | Exe 9 | Properties 10 | ConsoleApp 11 | ConsoleApp 12 | v4.0 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 57 | -------------------------------------------------------------------------------- /ETermSimulator/ETermSimulator.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {0C5EDE5C-EE87-4456-B8AF-D031E54AB586} 8 | Exe 9 | Properties 10 | ETermSimulator 11 | ETermSimulator 12 | v4.0 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 61 | -------------------------------------------------------------------------------- /SocketAgent/SocketAgent.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {4921F00C-28F6-444F-B4AA-AAB82F00E4E8} 8 | Exe 9 | Properties 10 | SocketAgent 11 | SocketAgent 12 | v4.0 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | Designer 53 | 54 | 55 | 56 | 63 | -------------------------------------------------------------------------------- /ETermSimulator.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2012 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{7AA5E8A8-8B3E-4290-ABEE-466718342876}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketAgent", "SocketAgent\SocketAgent.csproj", "{4921F00C-28F6-444F-B4AA-AAB82F00E4E8}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ETermSimulator", "ETermSimulator\ETermSimulator.csproj", "{0C5EDE5C-EE87-4456-B8AF-D031E54AB586}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SocketClient", "SocketClient\SocketClient.csproj", "{165F68ED-850D-43AD-8D5E-444C8C19BAA9}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ETermSimulatorTest", "EtermSimulatorTest\ETermSimulatorTest.csproj", "{BB2641B8-677F-4D62-B255-4BE2B1642FB1}" 13 | EndProject 14 | Global 15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 16 | Debug|Any CPU = Debug|Any CPU 17 | Release|Any CPU = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 20 | {7AA5E8A8-8B3E-4290-ABEE-466718342876}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {7AA5E8A8-8B3E-4290-ABEE-466718342876}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {7AA5E8A8-8B3E-4290-ABEE-466718342876}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {7AA5E8A8-8B3E-4290-ABEE-466718342876}.Release|Any CPU.Build.0 = Release|Any CPU 24 | {4921F00C-28F6-444F-B4AA-AAB82F00E4E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 25 | {4921F00C-28F6-444F-B4AA-AAB82F00E4E8}.Debug|Any CPU.Build.0 = Debug|Any CPU 26 | {4921F00C-28F6-444F-B4AA-AAB82F00E4E8}.Release|Any CPU.ActiveCfg = Release|Any CPU 27 | {4921F00C-28F6-444F-B4AA-AAB82F00E4E8}.Release|Any CPU.Build.0 = Release|Any CPU 28 | {0C5EDE5C-EE87-4456-B8AF-D031E54AB586}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 29 | {0C5EDE5C-EE87-4456-B8AF-D031E54AB586}.Debug|Any CPU.Build.0 = Debug|Any CPU 30 | {0C5EDE5C-EE87-4456-B8AF-D031E54AB586}.Release|Any CPU.ActiveCfg = Release|Any CPU 31 | {0C5EDE5C-EE87-4456-B8AF-D031E54AB586}.Release|Any CPU.Build.0 = Release|Any CPU 32 | {165F68ED-850D-43AD-8D5E-444C8C19BAA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 33 | {165F68ED-850D-43AD-8D5E-444C8C19BAA9}.Debug|Any CPU.Build.0 = Debug|Any CPU 34 | {165F68ED-850D-43AD-8D5E-444C8C19BAA9}.Release|Any CPU.ActiveCfg = Release|Any CPU 35 | {165F68ED-850D-43AD-8D5E-444C8C19BAA9}.Release|Any CPU.Build.0 = Release|Any CPU 36 | {BB2641B8-677F-4D62-B255-4BE2B1642FB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 37 | {BB2641B8-677F-4D62-B255-4BE2B1642FB1}.Debug|Any CPU.Build.0 = Debug|Any CPU 38 | {BB2641B8-677F-4D62-B255-4BE2B1642FB1}.Release|Any CPU.ActiveCfg = Release|Any CPU 39 | {BB2641B8-677F-4D62-B255-4BE2B1642FB1}.Release|Any CPU.Build.0 = Release|Any CPU 40 | EndGlobalSection 41 | GlobalSection(SolutionProperties) = preSolution 42 | HideSolutionNode = FALSE 43 | EndGlobalSection 44 | EndGlobal 45 | -------------------------------------------------------------------------------- /SocketClient/SocketClient.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {165F68ED-850D-43AD-8D5E-444C8C19BAA9} 8 | Exe 9 | Properties 10 | SocketClient 11 | SocketClient 12 | v4.5 13 | 512 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 64 | -------------------------------------------------------------------------------- /SocketAgent/AgentServer2.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Configuration; 3 | using System.Net.Sockets; 4 | 5 | namespace MDLabs.EtermSimulator.SocketAgent 6 | { 7 | public class AgentServer2 8 | { 9 | private TcpClient _TcpClient; 10 | private TcpClient agentClient = GetTcpClient(); 11 | private byte[] receiveBuffer; 12 | private int _CollectionID; 13 | 14 | public AgentServer2(TcpClient tcpClient, int collectionID) 15 | { 16 | _CollectionID = collectionID; 17 | _TcpClient = tcpClient; 18 | receiveBuffer = new byte[_TcpClient.ReceiveBufferSize]; 19 | System.Threading.Thread t = new System.Threading.Thread(StartAgentClient); 20 | t.Start(); 21 | while (true) 22 | { 23 | int i = _TcpClient.GetStream().Read(receiveBuffer, 0, _TcpClient.ReceiveBufferSize);//开始读取客户端发送的数据 24 | if (i > 0) 25 | { 26 | //string str = System.Text.ASCIIEncoding.GetEncoding("gb2312").GetString(receiveBuffer, 0, i); 27 | string str = System.Text.ASCIIEncoding.UTF8.GetString(receiveBuffer, 0, i); 28 | agentClient.GetStream().Write(receiveBuffer, 0, i);//将客户端发送的数据 开始转发给 服务器 29 | Output(_CollectionID, "客户端gb2312", str); 30 | Output(_CollectionID, "客户端", receiveBuffer, i); 31 | } 32 | } 33 | } 34 | private void StartAgentClient() 35 | { 36 | while (true) 37 | { 38 | int j = agentClient.GetStream().Read(receiveBuffer, 0, agentClient.ReceiveBufferSize);//读取服务器返回的数据 39 | if (j > 0) 40 | { 41 | //string str2 = System.Text.ASCIIEncoding.GetEncoding("gb2312").GetString(receiveBuffer, 0, j); 42 | string str2 = System.Text.ASCIIEncoding.UTF8.GetString(receiveBuffer, 0, j); 43 | _TcpClient.GetStream().Write(receiveBuffer, 0, j);//转发给客户端 44 | Output(_CollectionID, "服务器gb2312", str2); 45 | Output(_CollectionID, "服务器", receiveBuffer, j); 46 | } 47 | } 48 | } 49 | #region 获取监听及服务器地址端口 50 | private static TcpClient GetTcpClient() 51 | { 52 | string ip = ConfigurationManager.AppSettings["EtermServerIP"]; 53 | int port = int.Parse(ConfigurationManager.AppSettings["EtermServerPort"]); 54 | return new TcpClient(ip, port); 55 | } 56 | #endregion 57 | 58 | #region 日志 59 | private static void Output(int id, string type, string str) 60 | { 61 | string log = string.Format("{0}|{1}|{2}", id, type, str); 62 | Console.WriteLine(log); 63 | //System.IO.File.AppendAllText("Log.txt", log + System.Environment.NewLine); 64 | } 65 | private static void Output(int id, string type, byte[] data, int length) 66 | { 67 | string log = id.ToString() + "|" + type + "|"; 68 | 69 | Console.Write(id.ToString() + "|" + type + "|"); 70 | for (int i = 0; i < length; i++) 71 | { 72 | log += string.Format("{0} ", data[i]); 73 | } 74 | Console.WriteLine(log); 75 | System.IO.File.AppendAllText("Log.txt", log + System.Environment.NewLine); 76 | } 77 | #endregion 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /SocketAgent/AgentServer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Configuration; 3 | using System.Net.Sockets; 4 | 5 | namespace MDLabs.EtermSimulator.SocketAgent 6 | { 7 | public class AgentServer 8 | { 9 | private TcpClient _TcpClient; 10 | private TcpClient agentClient = GetTcpClient(); 11 | private byte[] receiveBuffer; 12 | private int _CollectionID; 13 | 14 | public AgentServer(TcpClient tcpClient, int collectionID) 15 | { 16 | _CollectionID = collectionID; 17 | _TcpClient = tcpClient; 18 | receiveBuffer = new byte[_TcpClient.ReceiveBufferSize]; 19 | _TcpClient.GetStream().BeginRead(receiveBuffer, 0, _TcpClient.ReceiveBufferSize, Receive, null);//开始读取客户端发送的数据 20 | 21 | } 22 | private void Receive(IAsyncResult ir) 23 | { 24 | int i = _TcpClient.GetStream().EndRead(ir);//接收到客户端发送的数据 25 | if (i > 0) 26 | { 27 | string str = System.Text.ASCIIEncoding.ASCII.GetString(receiveBuffer, 0, i); 28 | Output(_CollectionID, "CA", str); 29 | Output(_CollectionID, "CA", receiveBuffer, i); 30 | agentClient.GetStream().BeginWrite(receiveBuffer, 0, i, Send, null);//将客户端发送的数据 开始转发给 服务器 31 | Output(_CollectionID, "AS", "BEGIN"); 32 | } 33 | } 34 | private void Send(IAsyncResult ir) 35 | { 36 | Output(_CollectionID, "AS", "END"); 37 | agentClient.GetStream().EndWrite(ir);//转发结束 38 | agentClient.GetStream().BeginRead(receiveBuffer, 0, agentClient.ReceiveBufferSize, Receive2, null);//读取服务器返回的数据 39 | } 40 | private void Receive2(IAsyncResult ir) 41 | { 42 | int i = agentClient.GetStream().EndRead(ir);//读取服务器返回的数据 43 | if (i > 0) 44 | { 45 | string str = System.Text.ASCIIEncoding.ASCII.GetString(receiveBuffer, 0, i); 46 | Output(_CollectionID, "SA", str); 47 | Output(_CollectionID, "SA", receiveBuffer, i); 48 | _TcpClient.GetStream().BeginWrite(receiveBuffer, 0, i, Send2, null);//转发给客户端 49 | Output(_CollectionID, "AC", "BEGIN"); 50 | } 51 | } 52 | private void Send2(IAsyncResult ir) 53 | { 54 | Output(_CollectionID, "AC", "END"); 55 | _TcpClient.GetStream().EndWrite(ir);//转发结束 56 | _TcpClient.GetStream().BeginRead(receiveBuffer, 0, _TcpClient.ReceiveBufferSize, Receive, null);//读取客户端发送的数据 57 | } 58 | 59 | #region 获取监听及服务器地址端口 60 | private static TcpClient GetTcpClient() 61 | { 62 | string ip = ConfigurationManager.AppSettings["EtermServerIP"]; 63 | int port = int.Parse(ConfigurationManager.AppSettings["EtermServerPort"]); 64 | return new TcpClient(ip, port); 65 | } 66 | #endregion 67 | 68 | #region 日志 69 | private static void Output(int id, string type, string str) 70 | { 71 | string log = string.Format("{0}|{1}|{2}", id, type, str); 72 | Console.WriteLine(log); 73 | //System.IO.File.AppendAllText("Log.txt", log + System.Environment.NewLine); 74 | } 75 | private static void Output(int id, string type, byte[] data, int length) 76 | { 77 | string log = id.ToString() + "|" + type + "|"; 78 | 79 | Console.Write(id.ToString() + "|" + type + "|"); 80 | for (int i = 0; i < length; i++) 81 | { 82 | log += string.Format("{0} ", data[i]); 83 | } 84 | Console.WriteLine(log); 85 | //System.IO.File.AppendAllText("Log.txt", log + System.Environment.NewLine); 86 | } 87 | #endregion 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /ETermSimulator/Eterm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Net.Sockets; 6 | 7 | namespace ETermSimulator 8 | { 9 | public class Eterm 10 | { 11 | private string _ClientIPAddress { get; set; } 12 | private string _ClientMacAddress { get; set; } 13 | private string _EtermVersion { get; set; } 14 | private string _EtermUserName { get; set; } 15 | private string _EtermPassword { get; set; } 16 | private string _JobNo{ get; set; } 17 | private string _JobNoPassword { get; set; } 18 | private TcpClient _TcpClient; 19 | private byte[] _Session=new byte[2]; 20 | 21 | string strworkport = "60a44cac46ab";//这个地方时登陆人的mac地址(其中的大写一律转换成小写,中间的分隔符去掉) 22 | string strport = "192.168.80.21";//这个地方可能会不一样(登陆人的ip地址) 23 | 24 | 25 | public bool Connection(string etermServerIP,int etermServerPort) 26 | { 27 | _TcpClient = new TcpClient(); 28 | _TcpClient.Connect(etermServerIP, etermServerPort); 29 | if (_TcpClient.Connected) 30 | { 31 | Console.Write("Eterm User Name:"); 32 | _EtermUserName = Console.ReadLine(); 33 | Console.Write("Eterm Password:"); 34 | _EtermPassword = Console.ReadLine(); 35 | Send(Loing()); 36 | byte[] receiveBuffer = new byte[_TcpClient.ReceiveBufferSize]; 37 | int receiveLength =_TcpClient.GetStream().Read(receiveBuffer, 0, receiveBuffer.Length); 38 | if (receiveLength > 0) 39 | { 40 | if (receiveBuffer[2] == 1) 41 | { 42 | Console.WriteLine("登陆成功!"); 43 | Array.Copy(receiveBuffer,8,_Session,0,2); 44 | 45 | } 46 | else 47 | { 48 | Console.WriteLine("登录失败!"); 49 | return false; 50 | } 51 | 52 | } 53 | System.Threading.Thread t = new System.Threading.Thread(Receive); 54 | t.Start(); 55 | 56 | EncodeMachine machine = new EncodeMachine(); 57 | Send(machine.TestA()); 58 | Send(machine.TestB()); 59 | 60 | while (true) 61 | { 62 | string str=Console.ReadLine(); 63 | Send(machine.MakeInstruct(_Session, str)); 64 | } 65 | } 66 | return true; 67 | //_TcpClient.GetStream().Write(); 68 | } 69 | public void Receive() 70 | { 71 | byte[] receiveBuffer = new byte[_TcpClient.ReceiveBufferSize]; 72 | while (true) 73 | { 74 | int receiveLength = _TcpClient.GetStream().Read(receiveBuffer, 0, receiveBuffer.Length); 75 | if (receiveLength > 0) 76 | { 77 | Console.Write("接收:"); 78 | for (int i = 0; i < receiveLength; i++) 79 | { 80 | Console.Write("{0},", receiveBuffer[i]); 81 | } 82 | Console.WriteLine(); 83 | var resp = new BaseResp(receiveBuffer); 84 | if (!string.IsNullOrWhiteSpace(resp.Text)) 85 | { 86 | var lines = resp.Text.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries); 87 | foreach (var line in lines) 88 | { 89 | Console.WriteLine(line); 90 | } 91 | } 92 | } 93 | } 94 | } 95 | private void Send(byte[] bytes) 96 | { 97 | _TcpClient.GetStream().Write(bytes, 0, bytes.Length); 98 | } 99 | public byte[] Loing() //string userName,string password(这个地方暂时先不传) 100 | { 101 | string strworkport = "60a44cac46ab";//这个地方时登陆人的mac地址(其中的大写一律转换成小写,中间的分隔符去掉) 102 | string strport = "192.168.80.21";//这个地方可能会不一样(登陆人的ip地址) 103 | EncodeMachine machine = new EncodeMachine(); 104 | byte[] Send = machine.LogEncode(_EtermUserName, _EtermPassword, strworkport, strport, "3847010"); 105 | return Send; 106 | } 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /EtermSimulatorTest/ETermSimulatorTest.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | {BB2641B8-677F-4D62-B255-4BE2B1642FB1} 7 | Library 8 | Properties 9 | EtermSimulatorTest 10 | EtermSimulatorTest 11 | v4.0 12 | 512 13 | {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 14 | 10.0 15 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 16 | $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages 17 | False 18 | UnitTest 19 | 20 | 21 | true 22 | full 23 | false 24 | bin\Debug\ 25 | DEBUG;TRACE 26 | prompt 27 | 4 28 | 29 | 30 | pdbonly 31 | true 32 | bin\Release\ 33 | TRACE 34 | prompt 35 | 4 36 | 37 | 38 | 39 | 40 | 3.5 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | {0c5ede5c-ee87-4456-b8af-d031e54ab586} 62 | ETermSimulator 63 | 64 | 65 | 66 | 67 | 68 | 69 | False 70 | 71 | 72 | False 73 | 74 | 75 | False 76 | 77 | 78 | False 79 | 80 | 81 | 82 | 83 | 84 | 85 | 92 | -------------------------------------------------------------------------------- /SocketClient/AnalysisMachine.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace SocketClient 8 | { 9 | public class AnalysisMachine 10 | { 11 | #region 解析登陆数据 12 | public void LoginAnalysis(byte[] logReceive) 13 | { 14 | if (logReceive.Length > 8)//这个表示要么是命令,要么是服务器返回的是正确的数据 15 | { 16 | if (logReceive[5] == logReceive[6]&&logReceive[6]==logReceive[7]&&logReceive[7]==0) //表示登陆服务器首次返回 17 | { 18 | var userid=LogService(logReceive);//登陆的账号 19 | } 20 | if(logReceive[4]==logReceive[5]&&logReceive[5]==logReceive[6]&&logReceive[7]==1)//这个表示发送的指令和命令 21 | { 22 | OrderService(logReceive); 23 | } 24 | //其他错误的还没有找到规律(错误的情况) 25 | } 26 | else //这个表示是测试返回的字节 27 | { 28 | 29 | } 30 | } 31 | #endregion 32 | 33 | #region 解析登陆命令 34 | public byte LogService(byte [] receiveService) 35 | {//取登陆号:这个地方需要研究一下(里面可能会包含权限问题) 36 | return receiveService[8]; //表示需要返回的账号标志 37 | } 38 | #endregion 39 | //下午的目标就是:把这个服务器上返回回来的数据进行解析,解析成字符串,然后输出出来。能把一般的命令解析出来,这就算完成了。 40 | #region 表示解析普通命令 41 | public string OrderService(byte [] receiveService) 42 | { 43 | string rtn = ""; 44 | Byte[] chineseCode=new byte[256]; 45 | Byte[] code=new byte[receiveService.Length];//该地方申请的长度与输出是有关系的,主意 46 | bool value = false; 47 | int m=0;//相当于chineseCode的指针 48 | int n=0;//相当于code的指针 49 | for (int i = 19; i < receiveService.Length; i++) 50 | { 51 | //出现的问题就是:1.遇到特殊标记的,如何处理 52 | //2.遇到汉字的情况如何处理? 53 | if (receiveService[i] < 32) 54 | { 55 | //表示特殊字符 56 | if (receiveService[i] == 13) 57 | { 58 | rtn+=TransToCode(code)+"~"; 59 | code=new byte[1024]; 60 | n = 0; 61 | } 62 | if (receiveService[i] == 28) 63 | { 64 | //表示红色标记开始 65 | rtn += "@"; 66 | } 67 | if (receiveService[i] == 29) 68 | { 69 | //表示红色标记结束 70 | rtn+="@"; 71 | } 72 | if (receiveService[i] == 14 && receiveService[i-1] == 27) 73 | { 74 | value = true; 75 | } 76 | if (receiveService[i] == 15 && receiveService[i - 1] == 27) 77 | { 78 | value = false; 79 | rtn += TransToChinese(chineseCode); 80 | } 81 | if (receiveService[i] == 30) 82 | { 83 | //表示是【光标的(三角)开始】 84 | rtn += "△"; 85 | } 86 | if (receiveService[i] == 9 && receiveService[i - 1] == 27) 87 | { 88 | //表示是个结束表示【四方小点儿】 89 | rtn += "□"; 90 | } 91 | if (receiveService[i] == 11 && receiveService[i - 1] == 27&&receiveService[i+3]==15&&receiveService[i+4]==3) 92 | { 93 | break; 94 | } 95 | if (receiveService[i] == 27) 96 | { 97 | continue; 98 | } 99 | if (receiveService[i] == 3) 100 | { 101 | break; 102 | } 103 | } 104 | else if (receiveService[i] >= 32) 105 | { 106 | if (receiveService[i] == 43) 107 | { 108 | rtn += "当前的内容没有显示完"; 109 | } 110 | if (receiveService[i] == 98 && receiveService[i - 1] == 27) 111 | { 112 | continue;//这个是显示不出来内容的。 113 | } 114 | if (value == true) 115 | { 116 | chineseCode[m] = receiveService[i]; 117 | m++; 118 | }else if(value==false) 119 | { 120 | code[n]=receiveService[i]; 121 | } 122 | } 123 | 124 | } 125 | return rtn; 126 | } 127 | #endregion 128 | #region 解析错误指令 129 | public byte[] FaultService(byte[] receiveService) 130 | { 131 | return null; 132 | } 133 | #endregion 134 | #region 根据gb2312转汉字 135 | private string TransToChinese(byte[] toChinese) 136 | { 137 | string str = ""; 138 | byte[] arry = new byte[2]; 139 | for (int i = 0; i < toChinese.Length; i++) 140 | { 141 | toChinese[i] = (byte)(toChinese[i] + 128); 142 | } 143 | for (int i = 0; i < toChinese.Length; i += 2) 144 | { 145 | arry[0] = toChinese[i]; 146 | arry[1] = toChinese[i + 1]; 147 | str += System.Text.Encoding.GetEncoding("gb2312").GetString(arry); 148 | } 149 | return str; 150 | } 151 | 152 | private string TransToCode(byte[] toCode) 153 | { 154 | string str = System.Text.Encoding.Default.GetString(toCode); 155 | return str; 156 | } 157 | #endregion 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /ETermSimulator/BaseResp.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace ETermSimulator 7 | { 8 | public class BaseResp 9 | { 10 | private const byte RespContentStartFlag = 2; 11 | private const byte RespContentEndFlag = 3; 12 | private const byte RespContentFuncFlag = 27; 13 | private const byte FuncPointFlag = 11; 14 | private const byte FuncGBKFlag = 14;//include(GB2312 and infrequently used character) 15 | private const byte FuncGBKInfrequentFlag = 120;//flag of infrequently used character 16 | private const byte FuncASCIIFlag = 15; 17 | private const byte FuncASCIIFlag2 = 98; 18 | private const byte FuncTextContentStartFlag = 77; 19 | private const byte FuncTabStopFlag = 9;//TabStop 20 | 21 | private const byte FuncSOEFlag = 30;//SOE 22 | 23 | 24 | 25 | public BaseResp(byte[] receiveBuffer) 26 | { 27 | if (receiveBuffer != null && receiveBuffer.Length > 13 && receiveBuffer[0] == 1 && receiveBuffer[1] == 0) 28 | { 29 | int respLength = receiveBuffer[2] * 256 + receiveBuffer[3]; 30 | Buffer = new byte[respLength]; 31 | Array.Copy(receiveBuffer,Buffer,respLength); 32 | List segments = SplitSegments(Buffer); 33 | if (Text == null) 34 | Text = ""; 35 | foreach (var segment in segments) 36 | { 37 | switch (segment[1]) 38 | { 39 | case FuncPointFlag: 40 | StartPoint = DealFuncPointFlag(segment); 41 | break; 42 | case FuncGBKFlag: 43 | Text += DealFuncGBKFlag(segment); 44 | break; 45 | case FuncASCIIFlag: 46 | case FuncASCIIFlag2: 47 | case FuncTabStopFlag: 48 | case FuncTextContentStartFlag: 49 | Text += DealFuncASCIIFlag(segment); 50 | break; 51 | default: 52 | continue; 53 | } 54 | } 55 | } 56 | } 57 | 58 | #region deal PointFlag 59 | private Point DealFuncPointFlag(byte[] segment) 60 | { 61 | return new Point((System.Int16)(segment[3] - 32), (System.Int16)(segment[4] - 32)); 62 | } 63 | #endregion 64 | 65 | #region deal GBKFlag 66 | private string DealFuncGBKFlag(byte[] segment) 67 | { 68 | List GBKList = new List(); 69 | for (int i = 0; i < segment.Length; i++) 70 | { 71 | if (i < 2)//head 72 | continue; 73 | if (segment[i] != FuncGBKInfrequentFlag)//frequently used character 74 | { 75 | 76 | var judge = 0x2f <= segment[i] + 0xa && segment[i] + 0xa <= 0x32; 77 | var first = judge ? segment[i+1] : segment[i]; 78 | var second = judge ? segment[i] : segment[i+1]; 79 | first = (byte)first - 0xe >= 0x24 ? (byte)(first - 0xe) : first; 80 | first = (byte)(first - 0x72); 81 | second = judge ? (byte)(second + 0xa) : second; 82 | second = (byte)(second - 0x80); 83 | GBKList.Add(first); 84 | GBKList.Add(second); 85 | //if (segment[i] < 37) 86 | // GBKList.Add((byte)(segment[i] + 142)); 87 | //else 88 | // GBKList.Add((byte)(segment[i] + 128)); 89 | //GBKList.Add((byte)(segment[i + 1] + 128)); 90 | i++; 91 | } 92 | else//infrequently used character 93 | { 94 | byte a = (byte)((((segment[i + 1] + 0x1) << 4) & 0xF0) | ((segment[i + 2] >> 2) & 0xF)); 95 | byte b = (byte)((segment[i + 3] + 0x1) + ((segment[i + 2] & 0x2) << 6)); 96 | GBKList.Add(a); 97 | GBKList.Add(b); 98 | i = i + 3; 99 | } 100 | } 101 | Encoding gbkEncoding = System.Text.Encoding.GetEncoding("GBK"); 102 | return gbkEncoding.GetString(GBKList.ToArray()); 103 | } 104 | #endregion 105 | 106 | #region deal ASCIIFlag 107 | private string DealFuncASCIIFlag(byte[] segment) 108 | { 109 | List AssciiList = new List(); 110 | for (int i = 0; i < segment.Length; i++) 111 | { 112 | if (i < 2)//head 113 | continue; 114 | if (segment[i] != FuncSOEFlag) 115 | AssciiList.Add(segment[i]); 116 | } 117 | Encoding assciiEncoding = new System.Text.ASCIIEncoding(); 118 | return assciiEncoding.GetString(AssciiList.ToArray()); 119 | } 120 | #endregion 121 | 122 | #region Split buffer with RespContentFuncFlag 123 | private List SplitSegments(byte[] buffer) 124 | { 125 | 126 | int contentStartIdx = Array.LastIndexOf(buffer, RespContentStartFlag);//因为前边表示长度的部分可能会存在2或者3 所以从后往前搜索 127 | int contentEndIdx = Array.LastIndexOf(buffer, RespContentEndFlag); 128 | List RespBufferSegments = new List(); 129 | var content = buffer.Skip(contentStartIdx + 1).Take(contentEndIdx - contentStartIdx - 1); 130 | List RespBufferSegmentStartIdxs = new List(); 131 | for (int i = contentStartIdx + 1; i <= contentStartIdx + 1 + content.Count(); i++) 132 | { 133 | if (buffer[i] == RespContentFuncFlag) 134 | { 135 | RespBufferSegmentStartIdxs.Add(i); 136 | } 137 | } 138 | for (int i = 0; i < RespBufferSegmentStartIdxs.Count - 1; i++) 139 | { 140 | RespBufferSegments.Add(buffer.Skip(RespBufferSegmentStartIdxs[i]).Take(RespBufferSegmentStartIdxs[i + 1] - RespBufferSegmentStartIdxs[i]).ToArray()); 141 | } 142 | RespBufferSegments.Add(buffer.Skip(RespBufferSegmentStartIdxs[RespBufferSegmentStartIdxs.Count - 1]).Take(contentEndIdx - RespBufferSegmentStartIdxs[RespBufferSegmentStartIdxs.Count - 1]).ToArray()); 143 | return RespBufferSegments; 144 | } 145 | #endregion 146 | 147 | public byte[] Buffer { get; private set; }//服务器返回的数据 148 | 149 | public string Text 150 | { 151 | get; 152 | private set; 153 | } 154 | 155 | public Point StartPoint { get; private set; } 156 | public Point? EndPoint { get; private set; } 157 | 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /SocketClient/ChineseToPinyin.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace SocketClient 7 | { 8 | public class ChineseToPinyin 9 | { 10 | 11 | private static readonly Dictionary CodeCollections = new Dictionary { 12 | { -20319, "a" }, { -20317, "ai" }, { -20304, "an" }, { -20295, "ang" }, { -20292, 13 | "ao" }, { -20283, "ba" }, { -20265, "bai" }, 14 | { -20257, "ban" }, { -20242, "bang" }, { -20230, "bao" }, { -20051, "bei" }, { -20036, 15 | "ben" }, { -20032, "beng" }, { -20026, "bi" } 16 | , { -20002, "bian" }, { -19990, "biao" }, { -19986, "bie" }, { -19982, "bin" }, { -19976, 17 | "bing" }, { -19805, "bo" }, 18 | { -19784, "bu" }, { -19775, "ca" }, { -19774, "cai" }, { -19763, "can" }, { -19756, "cang" }, 19 | { -19751, "cao" }, { -19746, "ce" }, 20 | {-19741, "ceng"},{ -19739,"cha" },{-19728,"chai"},{-19725,"chan"}, { -19715, "chang" }, { -19540, "chao" }, 21 | { -19531, "che" }, { -19525, "chen" }, { -19515, "cheng" }, { -19500, "chi" }, { -19484, 22 | "chong" }, { -19479, "chou" },{ -19467, "chu"}, { -19289, "chuai" }, { -19288, "chuan" }, { -19281, "chuang" }, { -19275, 23 | "chui" }, { -19270, "chun" },{ -19263, "chuo"}, { -19261, "ci" }, { -19249, "cong" }, { -19243, "cou" }, { -19242, 24 | "cu" }, { -19238, "cuan" },{ -19235, "cui" }, { -19227, "cun" }, { -19224, "cuo" }, { -19218, "da" }, { -19212, "dai" }, 25 | { -19038, "dan" }, { -19023, "dang" },{ -19018, "dao" }, { -19006, "de" }, { -19003, "deng" }, { -18996, "di" }, { -18977, 26 | "dian" }, { -18961, "diao" }, { -18952, "die" }, { -18783, "ding" }, { -18774, "diu" }, { -18773, "dong" }, { -18763, "dou" }, { -18756, 27 | "du" }, { -18741, "duan" }, { -18735, "dui" }, { -18731, "dun" }, { -18722, "duo" }, { -18710, "e" }, { -18697, "en" }, 28 | { -18696, "er" }, { -18526, "fa" },{ -18518, "fan" }, { -18501, "fang" }, { -18490, "fei" }, { -18478, "fen" }, { -18463, 29 | "feng" }, { -18448, "fo" }, { -18447, "fou" }, { -18446, "fu" }, { -18239, "ga"}, { -18237, "gai" }, { -18231, "gan" }, { -18220, "gang" }, 30 | { -18211, "gao" }, { -18201, "ge" },{-18184,"gei"},{ -18183, "gen"},{-18181,"geng"},{-18012,"gong" 31 | }, 32 | { -17997, "gou" }, { -17988, "gu" }, { -17970, "gua" } 33 | , { -17964, "guai" }, { -17961, "guan" }, { -17950, "guang" }, { -17947, "gui" }, { -17931,"gun" }, { -17928, "guo" }, 34 | { -17922, "ha"}, { -17759, "hai" }, { -17752, "han"}, { -17733, "hang" }, { -17730, "hao" }, 35 | { -17721, "he" }, { -17703, "hei" },{-17701, "hen" },{-17697,"heng"},{-17692,"hong"},{-17683,"hou"}, 36 | { -17676, "hu" }, { -17496, "hua" },{ -17487, "huai" }, { -17482, "huan" }, { -17468, "huang" }, { -17454, "hui" }, { -17433, 37 | "hun" }, { -17427, "huo" },{ -17417, "ji" }, { -17202, "jia" }, { -17185, "jian" }, { -16983, "jiang" }, { -16970, "jiao" }, 38 | { -16942, "jie" },{ -16915, "jin" }, { -16733, "jing" }, { -16708, "jiong" }, { -16706, "jiu" }, { -16689, "ju" }, 39 | { -16664, "juan" },{ -16657, "jue" }, { -16647, "jun" }, { -16474, "ka" }, { -16470, "kai" }, { -16465, "kan" }, 40 | { -16459, "kang" }, { -16452, "kao" },{-16448,"ke"},{-16433,"ken"},{ -16429,"keng"},{-16427,"kong"},{ -16423, "kou" }, { -16419, "ku" }, 41 | { -16412, "kua" }, { -16407, "kuai" }, { -16403, "kuan" }, { -16401, "kuang" }, { -16393, "kui" }, { -16220,"kun" }, { -16216, "kuo" }, 42 | { -16212, "la" }, { -16205, "lai" }, { -16202, "lan" }, { -16187, "lang" }, { -16180, "lao" }, 43 | { -16171, "le" }, { -16169, "lei" }, 44 | { -16158, "leng" }, { -16155, "li" }, { -15959, "lia" }, { -15958, "lian" }, { -15944, "liang" },{ -15933, "liao" }, 45 | { -15920, "lie" }, { -15915, "lin" }, { -15903, "ling" }, { -15889, "liu" }, { -15878, "long" }, 46 | { -15707, "lou" }, { -15701, "lu" }, { -15681, "lv" }, { -15667, "luan" }, { -15661, "lue" }, { -15659, "lun" }, { -15652, 47 | "luo" }, { -15640, "ma" }, { -15631, "mai" }, 48 | { -15625,"man" }, {-15454,"mang"},{-15448,"mao"},{ -15436,"me"},{ -15435, "mei" }, { -15419, "men" }, 49 | { -15416, "meng" }, { -15408, "mi" }, { -15394, "mian" }, { -15385, "miao" }, { -15377,"mie" }, { -15375, "min" }, 50 | { -15369, "ming" }, { -15363, "miu" }, { -15362, "mo" }, { -15183, "mou" }, { -15180,"mu" }, { -15165, "na" }, { -15158, "nai" }, 51 | { -15153, "nan" }, { -15150,"nang" }, { -15149, "nao" }, { -15144, "ne" }, { -15143, "nei" }, 52 | { -15141, "nen" }, { -15140, "neng" }, { -15139, "ni" }, { -15128, "nian" }, { -15121, "niang" }, { -15119, "niao" }, { -15117, 53 | "nie" }, { -15110, "nin" },{ -15109, "ning" }, { -14941, "niu" }, { -14937, "nong" }, { -14933, "nu" }, { -14930, "nv" }, 54 | { -14929, "nuan" }, { -14928, "nue" } 55 | , { -14926, "nuo" }, { -14922, "o" }, { -14921, "ou" }, { -14914, "pa" }, { -14908, "pai" }, 56 | { -14902, "pan" }, { -14894, "pang" }, 57 | { -14889, "pao" }, { -14882, "pei" }, { -14873, "pen" }, { -14871, "peng" }, { -14857, 58 | "pi" }, { -14678, "pian" }, 59 | { -14674, "piao" }, { -14670, "pie" }, { -14668, "pin" }, { -14663, "ping" }, { -14654, "po" }, 60 | { -14645, "pu" }, { -14630, "qi" },{ -14594,"qia"},{-14429,"qian"},{-14407,"qiang"},{-14399,"qiao"}, 61 | { -14384, "qie" }, { -14379, "qin" },{ -14368, "qing"}, { -14355, "qiong" }, { -14353, "qiu" }, { -14345, "qu" }, { -14170, 62 | "quan" }, { -14159, "que" },{ -14151, "qun"}, { -14149, "ran" }, { -14145, "rang" }, { -14140, "rao"}, { -14137, "re" }, 63 | { -14135, "ren" }, { -14125, "reng" }, { -14123, "ri" }, { -14122, "rong"}, { -14112, "rou" }, { -14109, "ru"}, { -14099, "ruan" }, 64 | { -14097, "rui" }, { -14094, "run" }, { -14092, "ruo" }, { -14090,"sa" }, { -14087, "sai" }, { -14083, "san" }, { -13917, "sang" }, 65 | { -13914, "sao" }, { -13910, "se" } , { -13907, "sen" }, { -13906, "seng" }, { -13905, "sha" }, { -13896, "shai" }, { -13894, 66 | "shan" }, { -13878, "shang" },{ -13870, "shao" }, { -13859, "she" }, { -13847, "shen" }, { -13831, "sheng" }, { -13658, 67 | "shi" }, { -13611, "shou" }, { -13601, "shu" }, { -13406, "shua" }, { -13404, "shuai" }, { -13400, "shuan" }, 68 | { -13398, "shuang" }, { -13395, "shui" },{-13391,"shun"},{-13387,"shuo"},{-13383,"si"},{-13367,"song"},{ -13359, "sou" }, { -13356, "su" }, 69 | { -13343, "suan" }, { -13340, "sui" }, { -13329, "sun" }, { -13326, "suo" 70 | }, { -13318, "ta" }, 71 | { -13147, "tai" }, { -13138, "tan" },{ -13120, "tang" }, { -13107, "tao" }, { -13096, "te" }, { -13095, "teng" 72 | }, { -13091,"ti" }, { -13076, "tian" },{ -13068, "tiao" }, { -13063,"tie" }, { -13060,"ting" }, { -12888, "tong" }, { -12875, "tou" }, 73 | { -12871, "tu" },{ -12860, "tuan" }, { -12858, "tui" }, { -12852, "tun" }, { -12849, "tuo" }, { -12838, "wa" }, 74 | { -12831, "wai" }, { -12829, "wan" }, { -12812, "wang" }, { -12802, "wei" }, { -12607, "wen" }, { -12597, "weng" }, { -12594, 75 | "wo" }, { -12585, "wu" }, { -12556, "xi" }, { -12359, "xia" }, { -12346, "xian" }, { -12320, "xiang" }, { -12300, "xiao" }, { -12120, 76 | "xie" }, { -12099, "xin" },{ -12089, "xing" }, { -12074, "xiong" }, { -12067, "xiu" }, { -12058, "xu" }, { -12039, 77 | "xuan" }, { -11867, "xue" },{ -11861, "xun" }, { -11847, "ya" }, { -11831, "yan" }, { -11798, "yang" }, { -11781, 78 | "yao" }, { -11604, "ye" }, { -11589, "yi" },{ -11536, "yin" }, { -11358, "ying" 79 | }, { -11340, "yo" }, { -11339, "yong" }, { -11324,"you" }, { -11303, "yu" }, 80 | { -11097, "yuan"}, { -11077, "yue" }, { -11067, "yun" }, { -11055, "za" }, { -11052, "zai" }, 81 | { -11045, "zan" },{ -11041, "zang" }, { -11038, "zao" }, { -11024, "ze" }, { -11020, "zei" }, { -11019, 82 | "zen" }, { -11018, "zeng" },{ -11014, "zha" }, { -10838, "zhai" }, { -10832, "zhan" }, { -10815, "zhang" }, { -10800, 83 | "zhao" }, { -10790, "zhe" },{ -10780, "zhen" }, { -10764, "zheng" }, { -10587, "zhi" }, { -10544, "zhong" }, { -10533, 84 | "zhou" }, { -10519, "zhu" },{-10331, "zhua"},{-10329,"zhuai"},{-10328,"zhuan"},{-10322,"zhuang"}, 85 | { -10315, "zhui" }, { -10309, "zhun" }, { -10307, "zhuo"}, { -10296, "zi" }, { -10281, "zong" }, { -10274, "zou" }, { -10270, "zu" }, 86 | { -10262, "zuan" }, { -10260, "zui" }, { -10256, "zun" }, { -10254, "zuo" } }; 87 | 88 | public static string ToPinYin(string txt) 89 | { 90 | txt = txt.Trim(); 91 | byte[] arr = new byte[2]; //每个汉字为2字节 92 | StringBuilder result = new StringBuilder();//使用StringBuilder优化字符串连接 93 | int charCode = 0; 94 | int arr1 = 0; 95 | int arr2 = 0; 96 | char[] arrChar = txt.ToCharArray(); 97 | for (int j = 0; j < arrChar.Length; j++) //遍历输入的字符 98 | { 99 | arr = System.Text.Encoding.Default.GetBytes(arrChar[j].ToString());//根据系统默认编码得到字节码 100 | if (arr.Length == 1)//如果只有1字节说明该字符不是汉字,结束本次循环 101 | { result.Append(arrChar[j].ToString()); continue; } 102 | arr1 = (short)(arr[0]); //取字节1 103 | arr2 = (short)(arr[1]); //取字节2 104 | charCode = arr1 * 256 + arr2 - 65536;//计算汉字的编码 105 | if (charCode > -10254 || charCode < -20319) //如果不在汉字编码范围内则不改变 106 | { 107 | result.Append(arrChar[j]); 108 | } 109 | else 110 | { //根据汉字编码范围查找对应的拼音并保存到结果中 111 | //由于charCode的键不一定存在,所以要找比他更小的键上一个键 112 | if (!CodeCollections.ContainsKey(charCode)) 113 | { 114 | for (int i = charCode; i <= 0; --i) 115 | { 116 | if (CodeCollections.ContainsKey(i)) 117 | { 118 | result.Append(CodeCollections[i]);//(想办法截取出一组,而不是单个的) 119 | break; 120 | } 121 | } 122 | } 123 | else 124 | { 125 | result.Append(CodeCollections[charCode]); 126 | 127 | } 128 | } 129 | } 130 | return result.ToString(); 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /ETermSimulator/ChineseToPinyin.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace ETermSimulator 7 | { 8 | public class ChineseToPinyin 9 | { 10 | 11 | private static readonly Dictionary CodeCollections = new Dictionary { 12 | { -20319, "a" }, { -20317, "ai" }, { -20304, "an" }, { -20295, "ang" }, { -20292, 13 | "ao" }, { -20283, "ba" }, { -20265, "bai" }, 14 | { -20257, "ban" }, { -20242, "bang" }, { -20230, "bao" }, { -20051, "bei" }, { -20036, 15 | "ben" }, { -20032, "beng" }, { -20026, "bi" } 16 | , { -20002, "bian" }, { -19990, "biao" }, { -19986, "bie" }, { -19982, "bin" }, { -19976, 17 | "bing" }, { -19805, "bo" }, 18 | { -19784, "bu" }, { -19775, "ca" }, { -19774, "cai" }, { -19763, "can" }, { -19756, "cang" }, 19 | { -19751, "cao" }, { -19746, "ce" }, 20 | {-19741, "ceng"},{ -19739,"cha" },{-19728,"chai"},{-19725,"chan"}, { -19715, "chang" }, { -19540, "chao" }, 21 | { -19531, "che" }, { -19525, "chen" }, { -19515, "cheng" }, { -19500, "chi" }, { -19484, 22 | "chong" }, { -19479, "chou" },{ -19467, "chu"}, { -19289, "chuai" }, { -19288, "chuan" }, { -19281, "chuang" }, { -19275, 23 | "chui" }, { -19270, "chun" },{ -19263, "chuo"}, { -19261, "ci" }, { -19249, "cong" }, { -19243, "cou" }, { -19242, 24 | "cu" }, { -19238, "cuan" },{ -19235, "cui" }, { -19227, "cun" }, { -19224, "cuo" }, { -19218, "da" }, { -19212, "dai" }, 25 | { -19038, "dan" }, { -19023, "dang" },{ -19018, "dao" }, { -19006, "de" }, { -19003, "deng" }, { -18996, "di" }, { -18977, 26 | "dian" }, { -18961, "diao" }, { -18952, "die" }, { -18783, "ding" }, { -18774, "diu" }, { -18773, "dong" }, { -18763, "dou" }, { -18756, 27 | "du" }, { -18741, "duan" }, { -18735, "dui" }, { -18731, "dun" }, { -18722, "duo" }, { -18710, "e" }, { -18697, "en" }, 28 | { -18696, "er" }, { -18526, "fa" },{ -18518, "fan" }, { -18501, "fang" }, { -18490, "fei" }, { -18478, "fen" }, { -18463, 29 | "feng" }, { -18448, "fo" }, { -18447, "fou" }, { -18446, "fu" }, { -18239, "ga"}, { -18237, "gai" }, { -18231, "gan" }, { -18220, "gang" }, 30 | { -18211, "gao" }, { -18201, "ge" },{-18184,"gei"},{ -18183, "gen"},{-18181,"geng"},{-18012,"gong" 31 | }, 32 | { -17997, "gou" }, { -17988, "gu" }, { -17970, "gua" } 33 | , { -17964, "guai" }, { -17961, "guan" }, { -17950, "guang" }, { -17947, "gui" }, { -17931,"gun" }, { -17928, "guo" }, 34 | { -17922, "ha"}, { -17759, "hai" }, { -17752, "han"}, { -17733, "hang" }, { -17730, "hao" }, 35 | { -17721, "he" }, { -17703, "hei" },{-17701, "hen" },{-17697,"heng"},{-17692,"hong"},{-17683,"hou"}, 36 | { -17676, "hu" }, { -17496, "hua" },{ -17487, "huai" }, { -17482, "huan" }, { -17468, "huang" }, { -17454, "hui" }, { -17433, 37 | "hun" }, { -17427, "huo" },{ -17417, "ji" }, { -17202, "jia" }, { -17185, "jian" }, { -16983, "jiang" }, { -16970, "jiao" }, 38 | { -16942, "jie" },{ -16915, "jin" }, { -16733, "jing" }, { -16708, "jiong" }, { -16706, "jiu" }, { -16689, "ju" }, 39 | { -16664, "juan" },{ -16657, "jue" }, { -16647, "jun" }, { -16474, "ka" }, { -16470, "kai" }, { -16465, "kan" }, 40 | { -16459, "kang" }, { -16452, "kao" },{-16448,"ke"},{-16433,"ken"},{ -16429,"keng"},{-16427,"kong"},{ -16423, "kou" }, { -16419, "ku" }, 41 | { -16412, "kua" }, { -16407, "kuai" }, { -16403, "kuan" }, { -16401, "kuang" }, { -16393, "kui" }, { -16220,"kun" }, { -16216, "kuo" }, 42 | { -16212, "la" }, { -16205, "lai" }, { -16202, "lan" }, { -16187, "lang" }, { -16180, "lao" }, 43 | { -16171, "le" }, { -16169, "lei" }, 44 | { -16158, "leng" }, { -16155, "li" }, { -15959, "lia" }, { -15958, "lian" }, { -15944, "liang" },{ -15933, "liao" }, 45 | { -15920, "lie" }, { -15915, "lin" }, { -15903, "ling" }, { -15889, "liu" }, { -15878, "long" }, 46 | { -15707, "lou" }, { -15701, "lu" }, { -15681, "lv" }, { -15667, "luan" }, { -15661, "lue" }, { -15659, "lun" }, { -15652, 47 | "luo" }, { -15640, "ma" }, { -15631, "mai" }, 48 | { -15625,"man" }, {-15454,"mang"},{-15448,"mao"},{ -15436,"me"},{ -15435, "mei" }, { -15419, "men" }, 49 | { -15416, "meng" }, { -15408, "mi" }, { -15394, "mian" }, { -15385, "miao" }, { -15377,"mie" }, { -15375, "min" }, 50 | { -15369, "ming" }, { -15363, "miu" }, { -15362, "mo" }, { -15183, "mou" }, { -15180,"mu" }, { -15165, "na" }, { -15158, "nai" }, 51 | { -15153, "nan" }, { -15150,"nang" }, { -15149, "nao" }, { -15144, "ne" }, { -15143, "nei" }, 52 | { -15141, "nen" }, { -15140, "neng" }, { -15139, "ni" }, { -15128, "nian" }, { -15121, "niang" }, { -15119, "niao" }, { -15117, 53 | "nie" }, { -15110, "nin" },{ -15109, "ning" }, { -14941, "niu" }, { -14937, "nong" }, { -14933, "nu" }, { -14930, "nv" }, 54 | { -14929, "nuan" }, { -14928, "nue" } 55 | , { -14926, "nuo" }, { -14922, "o" }, { -14921, "ou" }, { -14914, "pa" }, { -14908, "pai" }, 56 | { -14902, "pan" }, { -14894, "pang" }, 57 | { -14889, "pao" }, { -14882, "pei" }, { -14873, "pen" }, { -14871, "peng" }, { -14857, 58 | "pi" }, { -14678, "pian" }, 59 | { -14674, "piao" }, { -14670, "pie" }, { -14668, "pin" }, { -14663, "ping" }, { -14654, "po" }, 60 | { -14645, "pu" }, { -14630, "qi" },{ -14594,"qia"},{-14429,"qian"},{-14407,"qiang"},{-14399,"qiao"}, 61 | { -14384, "qie" }, { -14379, "qin" },{ -14368, "qing"}, { -14355, "qiong" }, { -14353, "qiu" }, { -14345, "qu" }, { -14170, 62 | "quan" }, { -14159, "que" },{ -14151, "qun"}, { -14149, "ran" }, { -14145, "rang" }, { -14140, "rao"}, { -14137, "re" }, 63 | { -14135, "ren" }, { -14125, "reng" }, { -14123, "ri" }, { -14122, "rong"}, { -14112, "rou" }, { -14109, "ru"}, { -14099, "ruan" }, 64 | { -14097, "rui" }, { -14094, "run" }, { -14092, "ruo" }, { -14090,"sa" }, { -14087, "sai" }, { -14083, "san" }, { -13917, "sang" }, 65 | { -13914, "sao" }, { -13910, "se" } , { -13907, "sen" }, { -13906, "seng" }, { -13905, "sha" }, { -13896, "shai" }, { -13894, 66 | "shan" }, { -13878, "shang" },{ -13870, "shao" }, { -13859, "she" }, { -13847, "shen" }, { -13831, "sheng" }, { -13658, 67 | "shi" }, { -13611, "shou" }, { -13601, "shu" }, { -13406, "shua" }, { -13404, "shuai" }, { -13400, "shuan" }, 68 | { -13398, "shuang" }, { -13395, "shui" },{-13391,"shun"},{-13387,"shuo"},{-13383,"si"},{-13367,"song"},{ -13359, "sou" }, { -13356, "su" }, 69 | { -13343, "suan" }, { -13340, "sui" }, { -13329, "sun" }, { -13326, "suo" 70 | }, { -13318, "ta" }, 71 | { -13147, "tai" }, { -13138, "tan" },{ -13120, "tang" }, { -13107, "tao" }, { -13096, "te" }, { -13095, "teng" 72 | }, { -13091,"ti" }, { -13076, "tian" },{ -13068, "tiao" }, { -13063,"tie" }, { -13060,"ting" }, { -12888, "tong" }, { -12875, "tou" }, 73 | { -12871, "tu" },{ -12860, "tuan" }, { -12858, "tui" }, { -12852, "tun" }, { -12849, "tuo" }, { -12838, "wa" }, 74 | { -12831, "wai" }, { -12829, "wan" }, { -12812, "wang" }, { -12802, "wei" }, { -12607, "wen" }, { -12597, "weng" }, { -12594, 75 | "wo" }, { -12585, "wu" }, { -12556, "xi" }, { -12359, "xia" }, { -12346, "xian" }, { -12320, "xiang" }, { -12300, "xiao" }, { -12120, 76 | "xie" }, { -12099, "xin" },{ -12089, "xing" }, { -12074, "xiong" }, { -12067, "xiu" }, { -12058, "xu" }, { -12039, 77 | "xuan" }, { -11867, "xue" },{ -11861, "xun" }, { -11847, "ya" }, { -11831, "yan" }, { -11798, "yang" }, { -11781, 78 | "yao" }, { -11604, "ye" }, { -11589, "yi" },{ -11536, "yin" }, { -11358, "ying" 79 | }, { -11340, "yo" }, { -11339, "yong" }, { -11324,"you" }, { -11303, "yu" }, 80 | { -11097, "yuan"}, { -11077, "yue" }, { -11067, "yun" }, { -11055, "za" }, { -11052, "zai" }, 81 | { -11045, "zan" },{ -11041, "zang" }, { -11038, "zao" }, { -11024, "ze" }, { -11020, "zei" }, { -11019, 82 | "zen" }, { -11018, "zeng" },{ -11014, "zha" }, { -10838, "zhai" }, { -10832, "zhan" }, { -10815, "zhang" }, { -10800, 83 | "zhao" }, { -10790, "zhe" },{ -10780, "zhen" }, { -10764, "zheng" }, { -10587, "zhi" }, { -10544, "zhong" }, { -10533, 84 | "zhou" }, { -10519, "zhu" },{-10331, "zhua"},{-10329,"zhuai"},{-10328,"zhuan"},{-10322,"zhuang"}, 85 | { -10315, "zhui" }, { -10309, "zhun" }, { -10307, "zhuo"}, { -10296, "zi" }, { -10281, "zong" }, { -10274, "zou" }, { -10270, "zu" }, 86 | { -10262, "zuan" }, { -10260, "zui" }, { -10256, "zun" }, { -10254, "zuo" } }; 87 | 88 | public static string ToPinYin(string txt) 89 | { 90 | txt = txt.Trim(); 91 | byte[] arr = new byte[2]; //每个汉字为2字节 92 | StringBuilder result = new StringBuilder();//使用StringBuilder优化字符串连接 93 | int charCode = 0; 94 | int arr1 = 0; 95 | int arr2 = 0; 96 | char[] arrChar = txt.ToCharArray(); 97 | for (int j = 0; j < arrChar.Length; j++) //遍历输入的字符 98 | { 99 | arr = System.Text.Encoding.Default.GetBytes(arrChar[j].ToString());//根据系统默认编码得到字节码 100 | if (arr.Length == 1)//如果只有1字节说明该字符不是汉字,结束本次循环 101 | { result.Append(arrChar[j].ToString()); continue; } 102 | arr1 = (short)(arr[0]); //取字节1 103 | arr2 = (short)(arr[1]); //取字节2 104 | charCode = arr1 * 256 + arr2 - 65536;//计算汉字的编码 105 | if (charCode > -10254 || charCode < -20319) //如果不在汉字编码范围内则不改变 106 | { 107 | result.Append(arrChar[j]); 108 | } 109 | else 110 | { //根据汉字编码范围查找对应的拼音并保存到结果中 111 | //由于charCode的键不一定存在,所以要找比他更小的键上一个键 112 | if (!CodeCollections.ContainsKey(charCode)) 113 | { 114 | for (int i = charCode; i <= 0; --i) 115 | { 116 | if (CodeCollections.ContainsKey(i)) 117 | { 118 | result.Append(CodeCollections[i]);//(想办法截取出一组,而不是单个的) 119 | break; 120 | } 121 | } 122 | } 123 | else 124 | { 125 | result.Append(CodeCollections[charCode]); 126 | 127 | } 128 | } 129 | } 130 | return result.ToString(); 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /ConsoleApp/ChineseToPinyin.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace ConsoleApp 7 | { 8 | public class ChineseToPinyin 9 | { 10 | 11 | private static readonly Dictionary CodeCollections = new Dictionary { 12 | { -20319, "a" }, { -20317, "ai" }, { -20304, "an" }, { -20295, "ang" }, { -20292, 13 | "ao" }, { -20283, "ba" }, { -20265, "bai" }, 14 | { -20257, "ban" }, { -20242, "bang" }, { -20230, "bao" }, { -20051, "bei" }, { -20036, 15 | "ben" }, { -20032, "beng" }, { -20026, "bi" } 16 | , { -20002, "bian" }, { -19990, "biao" }, { -19986, "bie" }, { -19982, "bin" }, { -19976, 17 | "bing" }, { -19805, "bo" }, 18 | { -19784, "bu" }, { -19775, "ca" }, { -19774, "cai" }, { -19763, "can" }, { -19756, "cang" }, 19 | { -19751, "cao" }, { -19746, "ce" }, 20 | {-19741, "ceng"},{ -19739,"cha" },{-19728,"chai"},{-19725,"chan"}, { -19715, "chang" }, { -19540, "chao" }, 21 | { -19531, "che" }, { -19525, "chen" }, { -19515, "cheng" }, { -19500, "chi" }, { -19484, 22 | "chong" }, { -19479, "chou" },{ -19467, "chu"}, { -19289, "chuai" }, { -19288, "chuan" }, { -19281, "chuang" }, { -19275, 23 | "chui" }, { -19270, "chun" },{ -19263, "chuo"}, { -19261, "ci" }, { -19249, "cong" }, { -19243, "cou" }, { -19242, 24 | "cu" }, { -19238, "cuan" },{ -19235, "cui" }, { -19227, "cun" }, { -19224, "cuo" }, { -19218, "da" }, { -19212, "dai" }, 25 | { -19038, "dan" }, { -19023, "dang" },{ -19018, "dao" }, { -19006, "de" }, { -19003, "deng" }, { -18996, "di" }, { -18977, 26 | "dian" }, { -18961, "diao" }, { -18952, "die" }, { -18783, "ding" }, { -18774, "diu" }, { -18773, "dong" }, { -18763, "dou" }, { -18756, 27 | "du" }, { -18741, "duan" }, { -18735, "dui" }, { -18731, "dun" }, { -18722, "duo" }, { -18710, "e" }, { -18697, "en" }, 28 | { -18696, "er" }, { -18526, "fa" },{ -18518, "fan" }, { -18501, "fang" }, { -18490, "fei" }, { -18478, "fen" }, { -18463, 29 | "feng" }, { -18448, "fo" }, { -18447, "fou" }, { -18446, "fu" }, { -18239, "ga"}, { -18237, "gai" }, { -18231, "gan" }, { -18220, "gang" }, 30 | { -18211, "gao" }, { -18201, "ge" },{-18184,"gei"},{ -18183, "gen"},{-18181,"geng"},{-18012,"gong" 31 | }, 32 | { -17997, "gou" }, { -17988, "gu" }, { -17970, "gua" } 33 | , { -17964, "guai" }, { -17961, "guan" }, { -17950, "guang" }, { -17947, "gui" }, { -17931,"gun" }, { -17928, "guo" }, 34 | { -17922, "ha"}, { -17759, "hai" }, { -17752, "han"}, { -17733, "hang" }, { -17730, "hao" }, 35 | { -17721, "he" }, { -17703, "hei" },{-17701, "hen" },{-17697,"heng"},{-17692,"hong"},{-17683,"hou"}, 36 | { -17676, "hu" }, { -17496, "hua" },{ -17487, "huai" }, { -17482, "huan" }, { -17468, "huang" }, { -17454, "hui" }, { -17433, 37 | "hun" }, { -17427, "huo" },{ -17417, "ji" }, { -17202, "jia" }, { -17185, "jian" }, { -16983, "jiang" }, { -16970, "jiao" }, 38 | { -16942, "jie" },{ -16915, "jin" }, { -16733, "jing" }, { -16708, "jiong" }, { -16706, "jiu" }, { -16689, "ju" }, 39 | { -16664, "juan" },{ -16657, "jue" }, { -16647, "jun" }, { -16474, "ka" }, { -16470, "kai" }, { -16465, "kan" }, 40 | { -16459, "kang" }, { -16452, "kao" },{-16448,"ke"},{-16433,"ken"},{ -16429,"keng"},{-16427,"kong"},{ -16423, "kou" }, { -16419, "ku" }, 41 | { -16412, "kua" }, { -16407, "kuai" }, { -16403, "kuan" }, { -16401, "kuang" }, { -16393, "kui" }, { -16220,"kun" }, { -16216, "kuo" }, 42 | { -16212, "la" }, { -16205, "lai" }, { -16202, "lan" }, { -16187, "lang" }, { -16180, "lao" }, 43 | { -16171, "le" }, { -16169, "lei" }, 44 | { -16158, "leng" }, { -16155, "li" }, { -15959, "lia" }, { -15958, "lian" }, { -15944, "liang" },{ -15933, "liao" }, 45 | { -15920, "lie" }, { -15915, "lin" }, { -15903, "ling" }, { -15889, "liu" }, { -15878, "long" }, 46 | { -15707, "lou" }, { -15701, "lu" }, { -15681, "lv" }, { -15667, "luan" }, { -15661, "lue" }, { -15659, "lun" }, { -15652, 47 | "luo" }, { -15640, "ma" }, { -15631, "mai" }, 48 | { -15625,"man" }, {-15454,"mang"},{-15448,"mao"},{ -15436,"me"},{ -15435, "mei" }, { -15419, "men" }, 49 | { -15416, "meng" }, { -15408, "mi" }, { -15394, "mian" }, { -15385, "miao" }, { -15377,"mie" }, { -15375, "min" }, 50 | { -15369, "ming" }, { -15363, "miu" }, { -15362, "mo" }, { -15183, "mou" }, { -15180,"mu" }, { -15165, "na" }, { -15158, "nai" }, 51 | { -15153, "nan" }, { -15150,"nang" }, { -15149, "nao" }, { -15144, "ne" }, { -15143, "nei" }, 52 | { -15141, "nen" }, { -15140, "neng" }, { -15139, "ni" }, { -15128, "nian" }, { -15121, "niang" }, { -15119, "niao" }, { -15117, 53 | "nie" }, { -15110, "nin" },{ -15109, "ning" }, { -14941, "niu" }, { -14937, "nong" }, { -14933, "nu" }, { -14930, "nv" }, 54 | { -14929, "nuan" }, { -14928, "nue" } 55 | , { -14926, "nuo" }, { -14922, "o" }, { -14921, "ou" }, { -14914, "pa" }, { -14908, "pai" }, 56 | { -14902, "pan" }, { -14894, "pang" }, 57 | { -14889, "pao" }, { -14882, "pei" }, { -14873, "pen" }, { -14871, "peng" }, { -14857, 58 | "pi" }, { -14678, "pian" }, 59 | { -14674, "piao" }, { -14670, "pie" }, { -14668, "pin" }, { -14663, "ping" }, { -14654, "po" }, 60 | { -14645, "pu" }, { -14630, "qi" },{ -14594,"qia"},{-14429,"qian"},{-14407,"qiang"},{-14399,"qiao"}, 61 | { -14384, "qie" }, { -14379, "qin" },{ -14368, "qing"}, { -14355, "qiong" }, { -14353, "qiu" }, { -14345, "qu" }, { -14170, 62 | "quan" }, { -14159, "que" },{ -14151, "qun"}, { -14149, "ran" }, { -14145, "rang" }, { -14140, "rao"}, { -14137, "re" }, 63 | { -14135, "ren" }, { -14125, "reng" }, { -14123, "ri" }, { -14122, "rong"}, { -14112, "rou" }, { -14109, "ru"}, { -14099, "ruan" }, 64 | { -14097, "rui" }, { -14094, "run" }, { -14092, "ruo" }, { -14090,"sa" }, { -14087, "sai" }, { -14083, "san" }, { -13917, "sang" }, 65 | { -13914, "sao" }, { -13910, "se" } , { -13907, "sen" }, { -13906, "seng" }, { -13905, "sha" }, { -13896, "shai" }, { -13894, 66 | "shan" }, { -13878, "shang" },{ -13870, "shao" }, { -13859, "she" }, { -13847, "shen" }, { -13831, "sheng" }, { -13658, 67 | "shi" }, { -13611, "shou" }, { -13601, "shu" }, { -13406, "shua" }, { -13404, "shuai" }, { -13400, "shuan" }, 68 | { -13398, "shuang" }, { -13395, "shui" },{-13391,"shun"},{-13387,"shuo"},{-13383,"si"},{-13367,"song"},{ -13359, "sou" }, { -13356, "su" }, 69 | { -13343, "suan" }, { -13340, "sui" }, { -13329, "sun" }, { -13326, "suo" 70 | }, { -13318, "ta" }, 71 | { -13147, "tai" }, { -13138, "tan" },{ -13120, "tang" }, { -13107, "tao" }, { -13096, "te" }, { -13095, "teng" 72 | }, { -13091,"ti" }, { -13076, "tian" },{ -13068, "tiao" }, { -13063,"tie" }, { -13060,"ting" }, { -12888, "tong" }, { -12875, "tou" }, 73 | { -12871, "tu" },{ -12860, "tuan" }, { -12858, "tui" }, { -12852, "tun" }, { -12849, "tuo" }, { -12838, "wa" }, 74 | { -12831, "wai" }, { -12829, "wan" }, { -12812, "wang" }, { -12802, "wei" }, { -12607, "wen" }, { -12597, "weng" }, { -12594, 75 | "wo" }, { -12585, "wu" }, { -12556, "xi" }, { -12359, "xia" }, { -12346, "xian" }, { -12320, "xiang" }, { -12300, "xiao" }, { -12120, 76 | "xie" }, { -12099, "xin" },{ -12089, "xing" }, { -12074, "xiong" }, { -12067, "xiu" }, { -12058, "xu" }, { -12039, 77 | "xuan" }, { -11867, "xue" },{ -11861, "xun" }, { -11847, "ya" }, { -11831, "yan" }, { -11798, "yang" }, { -11781, 78 | "yao" }, { -11604, "ye" }, { -11589, "yi" },{ -11536, "yin" }, { -11358, "ying" 79 | }, { -11340, "yo" }, { -11339, "yong" }, { -11324,"you" }, { -11303, "yu" }, 80 | { -11097, "yuan"}, { -11077, "yue" }, { -11067, "yun" }, { -11055, "za" }, { -11052, "zai" }, 81 | { -11045, "zan" },{ -11041, "zang" }, { -11038, "zao" }, { -11024, "ze" }, { -11020, "zei" }, { -11019, 82 | "zen" }, { -11018, "zeng" },{ -11014, "zha" }, { -10838, "zhai" }, { -10832, "zhan" }, { -10815, "zhang" }, { -10800, 83 | "zhao" }, { -10790, "zhe" },{ -10780, "zhen" }, { -10764, "zheng" }, { -10587, "zhi" }, { -10544, "zhong" }, { -10533, 84 | "zhou" }, { -10519, "zhu" },{-10331, "zhua"},{-10329,"zhuai"},{-10328,"zhuan"},{-10322,"zhuang"}, 85 | { -10315, "zhui" }, { -10309, "zhun" }, { -10307, "zhuo"}, { -10296, "zi" }, { -10281, "zong" }, { -10274, "zou" }, { -10270, "zu" }, 86 | { -10262, "zuan" }, { -10260, "zui" }, { -10256, "zun" }, { -10254, "zuo" } }; 87 | 88 | public static string ToPinYin(string txt) 89 | { 90 | txt = txt.Trim(); 91 | byte[] arr = new byte[2]; //每个汉字为2字节 92 | StringBuilder result = new StringBuilder();//使用StringBuilder优化字符串连接 93 | int charCode = 0; 94 | int arr1 = 0; 95 | int arr2 = 0; 96 | char[] arrChar = txt.ToCharArray(); 97 | for (int j = 0; j < arrChar.Length; j++) //遍历输入的字符 98 | { 99 | arr = System.Text.Encoding.Default.GetBytes(arrChar[j].ToString());//根据系统默认编码得到字节码 100 | if (arr.Length == 1)//如果只有1字节说明该字符不是汉字,结束本次循环 101 | { 102 | result.Append(arrChar[j].ToString()); 103 | continue; 104 | } 105 | arr1 = (short)(arr[0]); //取字节1 106 | arr2 = (short)(arr[1]); //取字节2 107 | charCode = arr1 * 256 + arr2 - 65536;//计算汉字的编码 108 | if (charCode > -10254 || charCode < -20319) //如果不在汉字编码范围内则不改变 109 | { 110 | result.Append(arrChar[j]); 111 | } 112 | else//根据汉字编码范围查找对应的拼音并保存到结果中 113 | { 114 | //由于charCode的键不一定存在,所以要找比他更小的键上一个键 115 | if (!CodeCollections.ContainsKey(charCode)) 116 | { 117 | for (int i = charCode; i <= 0; --i) 118 | { 119 | if (CodeCollections.ContainsKey(i)) 120 | { 121 | //这个怎么处理?让$$名字** 122 | result.Append(CodeCollections[i]); 123 | break; 124 | } 125 | } 126 | } 127 | else 128 | { 129 | result.Append(CodeCollections[charCode]); 130 | } 131 | } 132 | } 133 | return result.ToString(); 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /EtermSimulatorTest/BaseRespTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.VisualStudio.TestTools.UnitTesting; 3 | using System; 4 | using System.Collections.Generic; 5 | using ETermSimulator; 6 | 7 | namespace ETermSimulatorTest 8 | { 9 | [TestClass] 10 | public class BaseRespTest 11 | { 12 | #region SplitSegments 13 | [TestMethod] 14 | public void SplitSegments_正常()//解析加法运算结果=2.0000 15 | { 16 | var po = new PrivateObject(new BaseResp(null)); 17 | byte[] arg = new byte[] { 1, 0, 0, 40, 0, 0, 0, 1, 40, 81, 112, 2, 27, 11, 33, 32, 15, 27, 77, 32, 32, 32, 32, 32, 32, 61, 32, 50, 46, 48, 48, 48, 48, 32, 32, 13, 30, 27, 98, 3 }; 18 | var r = (List)po.Invoke("SplitSegments", new object[] { arg }); 19 | Assert.AreEqual(r.Count, 3); 20 | Assert.AreEqual(string.Join(",", r[0]), string.Join(",", new byte[] { 27, 11, 33, 32, 15 })); 21 | Assert.AreEqual(string.Join(",", r[1]), string.Join(",", new byte[] { 27, 77, 32, 32, 32, 32, 32, 32, 61, 32, 50, 46, 48, 48, 48, 48, 32, 32, 13, 30 })); 22 | Assert.AreEqual(string.Join(",", r[2]), string.Join(",", new byte[] { 27, 98 })); 23 | 24 | } 25 | 26 | [TestMethod] 27 | public void SplitSegements_AV() 28 | { 29 | var po = new PrivateObject(new BaseResp(null)); 30 | byte[] arg = new byte[] { 1, 0, 3, 77, 0, 0, 0, 1, 40, 81, 112, 2, 27, 11, 33, 32, 15, 27, 77, 32, 50, 53, 83, 69, 80, 40, 87, 69, 68, 41, 32, 83, 72, 65, 67, 71, 79, 32, 32, 13, 49, 32, 32, 32, 77, 85, 53, 51, 57, 53, 32, 32, 83, 72, 65, 67, 71, 79, 32, 48, 56, 48, 53, 32, 32, 32, 48, 57, 52, 53, 32, 32, 32, 51, 50, 51, 32, 48, 94, 83, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 70, 65, 32, 80, 81, 32, 65, 83, 32, 89, 65, 32, 66, 81, 60, 84, 50, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 81, 32, 13, 50, 32, 32, 32, 77, 85, 53, 52, 48, 32, 32, 32, 80, 86, 71, 67, 71, 79, 32, 48, 56, 52, 53, 32, 32, 32, 49, 48, 52, 48, 32, 32, 32, 51, 50, 48, 32, 48, 94, 83, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 74, 54, 32, 67, 81, 32, 68, 81, 32, 73, 81, 32, 79, 81, 60, 84, 49, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 89, 65, 32, 66, 81, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 83, 32, 32, 32, 13, 51, 32, 32, 42, 77, 85, 57, 51, 50, 55, 32, 32, 83, 72, 65, 67, 71, 79, 32, 48, 57, 53, 48, 32, 32, 32, 49, 49, 52, 48, 32, 32, 32, 55, 51, 56, 32, 48, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 70, 54, 32, 80, 81, 32, 65, 49, 32, 89, 52, 32, 66, 81, 60, 84, 50, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 70, 77, 57, 51, 50, 55, 32, 32, 32, 32, 32, 32, 32, 32, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 81, 32, 13, 52, 43, 32, 32, 70, 77, 57, 51, 50, 55, 32, 32, 83, 72, 65, 67, 71, 79, 32, 48, 57, 53, 48, 32, 32, 32, 49, 49, 52, 48, 32, 32, 32, 55, 51, 56, 32, 48, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 70, 54, 32, 80, 81, 32, 65, 49, 32, 89, 52, 32, 66, 81, 60, 84, 50, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 81, 32, 13, 42, 42, 32, 32, 42, 42, 32, 32, 67, 90, 45, 83, 72, 65, 32, 32, 67, 72, 69, 67, 75, 32, 73, 78, 32, 52, 53, 32, 77, 73, 78, 85, 84, 69, 83, 32, 66, 69, 70, 79, 82, 69, 32, 68, 69, 80, 65, 82, 84, 85, 82, 69, 32, 32, 13, 42, 42, 32, 32, 65, 108, 108, 32, 115, 99, 104, 101, 100, 117, 108, 101, 100, 32, 77, 85, 32, 111, 114, 32, 70, 77, 32, 102, 108, 105, 103, 104, 116, 115, 32, 111, 112, 101, 114, 97, 116, 101, 100, 32, 98, 121, 32, 77, 85, 32, 111, 114, 32, 70, 77, 32, 97, 114, 101, 32, 34, 69, 97, 115, 116, 101, 114, 110, 32, 69, 120, 112, 114, 101, 115, 115, 34, 32, 32, 32, 42, 42, 32, 32, 72, 79, 32, 70, 76, 73, 71, 72, 84, 32, 68, 69, 80, 65, 82, 84, 85, 82, 69, 47, 65, 82, 82, 73, 86, 65, 76, 32, 65, 84, 32, 80, 86, 71, 32, 84, 50, 32, 70, 82, 79, 77, 32, 49, 56, 68, 69, 67, 49, 50, 44, 32, 13, 42, 42, 32, 32, 72, 79, 32, 80, 86, 71, 32, 67, 72, 69, 67, 75, 32, 73, 78, 32, 52, 53, 32, 77, 73, 78, 85, 84, 69, 83, 32, 66, 69, 70, 79, 82, 69, 32, 68, 69, 80, 65, 82, 84, 85, 82, 69, 32, 13, 30, 27, 98, 3 }; 31 | var r = (List)po.Invoke("SplitSegments", new object[] { arg }); 32 | Assert.AreEqual(r.Count, 3); 33 | Assert.AreEqual(string.Join(",", r[0]), string.Join(",", new byte[] { 27, 11, 33, 32, 15 })); 34 | Assert.AreEqual(string.Join(",", r[1]), string.Join(",", new byte[] { 27, 77, 32, 50, 53, 83, 69, 80, 40, 87, 69, 68, 41, 32, 83, 72, 65, 67, 71, 79, 32, 32, 13, 49, 32, 32, 32, 77, 85, 53, 51, 57, 53, 32, 32, 83, 72, 65, 67, 71, 79, 32, 48, 56, 48, 53, 32, 32, 32, 48, 57, 52, 53, 32, 32, 32, 51, 50, 51, 32, 48, 94, 83, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 70, 65, 32, 80, 81, 32, 65, 83, 32, 89, 65, 32, 66, 81, 60, 84, 50, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 81, 32, 13, 50, 32, 32, 32, 77, 85, 53, 52, 48, 32, 32, 32, 80, 86, 71, 67, 71, 79, 32, 48, 56, 52, 53, 32, 32, 32, 49, 48, 52, 48, 32, 32, 32, 51, 50, 48, 32, 48, 94, 83, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 74, 54, 32, 67, 81, 32, 68, 81, 32, 73, 81, 32, 79, 81, 60, 84, 49, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 89, 65, 32, 66, 81, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 83, 32, 32, 32, 13, 51, 32, 32, 42, 77, 85, 57, 51, 50, 55, 32, 32, 83, 72, 65, 67, 71, 79, 32, 48, 57, 53, 48, 32, 32, 32, 49, 49, 52, 48, 32, 32, 32, 55, 51, 56, 32, 48, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 70, 54, 32, 80, 81, 32, 65, 49, 32, 89, 52, 32, 66, 81, 60, 84, 50, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 70, 77, 57, 51, 50, 55, 32, 32, 32, 32, 32, 32, 32, 32, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 81, 32, 13, 52, 43, 32, 32, 70, 77, 57, 51, 50, 55, 32, 32, 83, 72, 65, 67, 71, 79, 32, 48, 57, 53, 48, 32, 32, 32, 49, 49, 52, 48, 32, 32, 32, 55, 51, 56, 32, 48, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 69, 70, 54, 32, 80, 81, 32, 65, 49, 32, 89, 52, 32, 66, 81, 60, 84, 50, 45, 45, 62, 32, 32, 13, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 77, 81, 32, 69, 81, 32, 72, 81, 32, 75, 81, 32, 76, 81, 32, 78, 81, 32, 82, 81, 32, 83, 81, 32, 86, 81, 32, 84, 81, 32, 71, 81, 32, 90, 81, 32, 81, 81, 32, 85, 81, 32, 88, 81, 32, 13, 42, 42, 32, 32, 42, 42, 32, 32, 67, 90, 45, 83, 72, 65, 32, 32, 67, 72, 69, 67, 75, 32, 73, 78, 32, 52, 53, 32, 77, 73, 78, 85, 84, 69, 83, 32, 66, 69, 70, 79, 82, 69, 32, 68, 69, 80, 65, 82, 84, 85, 82, 69, 32, 32, 13, 42, 42, 32, 32, 65, 108, 108, 32, 115, 99, 104, 101, 100, 117, 108, 101, 100, 32, 77, 85, 32, 111, 114, 32, 70, 77, 32, 102, 108, 105, 103, 104, 116, 115, 32, 111, 112, 101, 114, 97, 116, 101, 100, 32, 98, 121, 32, 77, 85, 32, 111, 114, 32, 70, 77, 32, 97, 114, 101, 32, 34, 69, 97, 115, 116, 101, 114, 110, 32, 69, 120, 112, 114, 101, 115, 115, 34, 32, 32, 32, 42, 42, 32, 32, 72, 79, 32, 70, 76, 73, 71, 72, 84, 32, 68, 69, 80, 65, 82, 84, 85, 82, 69, 47, 65, 82, 82, 73, 86, 65, 76, 32, 65, 84, 32, 80, 86, 71, 32, 84, 50, 32, 70, 82, 79, 77, 32, 49, 56, 68, 69, 67, 49, 50, 44, 32, 13, 42, 42, 32, 32, 72, 79, 32, 80, 86, 71, 32, 67, 72, 69, 67, 75, 32, 73, 78, 32, 52, 53, 32, 77, 73, 78, 85, 84, 69, 83, 32, 66, 69, 70, 79, 82, 69, 32, 68, 69, 80, 65, 82, 84, 85, 82, 69, 32, 13, 30 })); 35 | Assert.AreEqual(string.Join(",", r[2]), string.Join(",", new byte[] { 27, 98 })); 36 | } 37 | #endregion 38 | 39 | #region DealFuncGBKFlag 40 | [TestMethod] 41 | public void DealFuncGBKFlag_GB2312SpecialCharacter()////上海地区天气预报 “报” is a special character! 42 | { 43 | var po = new PrivateObject(new BaseResp(null)); 44 | byte[] arg = new byte[] { 27,14,73,79,58,35,53,88,71,120,76,108,70,120,84,36,35,40}; 45 | var r = (string)po.Invoke("DealFuncGBKFlag", new object[] { arg }); 46 | Assert.AreEqual(r, "上海地区天气预报"); 47 | } 48 | [TestMethod] 49 | public void DealFuncGBKFlag_GB2312NormalCharacter()//多云转中雨 50 | { 51 | var po = new PrivateObject(new BaseResp(null)); 52 | byte[] arg = new byte[] { 27,14,54,96,84,70,87,42,86,80,83,106}; 53 | var r = (string)po.Invoke("DealFuncGBKFlag", new object[] { arg }); 54 | Assert.AreEqual(r, "多云转中雨"); 55 | } 56 | [TestMethod] 57 | public void DealFuncGBKFlag_GBKInfrequentlyUsedCharacter()//朱镕基 “镕” is not a frequently used character 58 | { 59 | var po = new PrivateObject(new BaseResp(null)); 60 | byte[] arg = new byte[] { 27,14,86, 108, 120, 77, 100, 69, 59, 121 }; 61 | var r = (string)po.Invoke("DealFuncGBKFlag", new object[] { arg }); 62 | Assert.AreEqual(r, "朱镕基"); 63 | } 64 | #endregion 65 | 66 | #region DealFuncPointFlag 67 | 68 | #endregion 69 | 70 | #region DealFuncASCIIFlag 71 | [TestMethod] 72 | public void DealFuncASCIIFlag_Test() 73 | { 74 | var po = new PrivateObject(new BaseResp(null)); 75 | byte[] arg = new byte[] {27,15,32,51,50,67,40,57,48,70,41,44,32}; 76 | var r = (string)po.Invoke("DealFuncASCIIFlag", new object[] { arg }); 77 | Assert.AreEqual(r, " 32C(90F), "); 78 | } 79 | #endregion 80 | 81 | #region BaseResp 82 | [TestMethod] 83 | public void BaseResp_Test() 84 | { 85 | byte[] arg = new byte[] { 1, 0, 1, 194, 0, 0, 0, 1, 40, 81, 112, 2, 27, 11, 49, 32, 15, 27, 77, 27, 14, 73, 79, 58, 35, 53, 88, 71, 120, 76, 108, 70, 120, 84, 36, 35, 40, 27, 15, 58, 32, 32, 32, 13, 32, 32, 32, 32, 32, 57, 27, 14, 84, 66, 27, 15, 50, 52, 27, 14, 72, 85, 27, 15, 32 ,27,98,13,30,27,98,3}; 86 | var r = new BaseResp(arg); 87 | var except = "上海地区天气预报: \r 9月24日 "; 88 | Assert.AreEqual(except, r.Text); 89 | } 90 | #endregion 91 | 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /SocketClient/EncodeMachine.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using SocketClient; 6 | 7 | 8 | namespace SocketClient 9 | { 10 | public class EncodeMachine 11 | { 12 | //1.登陆编码 13 | //2.指令登陆 14 | #region 登陆编码 15 | public byte[] LogEncode(string userName,string password,string strworkport,string strport ) 16 | { 17 | string fixstr = "3847010"; 18 | byte[] LogSend = new byte[162]; 19 | byte[] user = System.Text.Encoding.Default.GetBytes(userName); 20 | byte[] pass = System.Text.Encoding.Default.GetBytes(password); 21 | byte[] port = System.Text.Encoding.Default.GetBytes(strport);//这个后 22 | byte[] workport = System.Text.Encoding.Default.GetBytes(strworkport);//这个先 23 | byte[] fixedstr = System.Text.Encoding.Default.GetBytes(fixstr);// 24 | for (int i = 0; i < 162; i++) 25 | { 26 | if (i == 0) LogSend[i] = 1; 27 | if (i == 1) LogSend[i] = 162; 28 | if (i > 1 && i < 2 + user.Length) //填充密码 29 | { 30 | LogSend[i] = user[i - 2]; 31 | } 32 | if (i >= user.Length + 2 && i < 2 + user.Length + 8) //填充8个0 33 | { 34 | LogSend[i] = 0; 35 | } 36 | if (i >= 10 + user.Length && i < 10 + user.Length + pass.Length)//填充密码 37 | { 38 | LogSend[i] = pass[i - user.Length - 10]; 39 | } 40 | if (i >= 10 + user.Length + pass.Length && i < 35 + user.Length + pass.Length) //填充后面的25个0 41 | { 42 | LogSend[i] = 0; 43 | } 44 | if (i >= 35 + user.Length + pass.Length && i < 35 + user.Length + pass.Length + workport.Length)//填充端口号前面的 45 | { 46 | LogSend[i] = workport[i - 35 - user.Length - pass.Length]; 47 | } 48 | if (i >= 35 + user.Length + pass.Length + workport.Length && i < 35 + user.Length + pass.Length + workport.Length + port.Length) //填充端口号 49 | { 50 | LogSend[i] = port[i - 35 - user.Length - pass.Length - workport.Length]; 51 | } 52 | if (i >= 35 + user.Length + pass.Length + workport.Length + port.Length && i < 37 + user.Length + pass.Length + workport.Length + port.Length) //后面添加两个空格 53 | { 54 | LogSend[i] = 32; 55 | } 56 | if (i >= 37 + user.Length + pass.Length + workport.Length + port.Length && i < fixedstr.Length + 37 + user.Length + pass.Length + workport.Length + port.Length)//添加3847010 57 | { 58 | LogSend[i] = fixedstr[i - 37 - user.Length - pass.Length - workport.Length - port.Length]; 59 | }//还要填写6个0 60 | if (i >= fixedstr.Length + 37 + user.Length + pass.Length + workport.Length + port.Length && i < fixedstr.Length + 44 + user.Length + pass.Length + workport.Length + port.Length) 61 | { 62 | if (i == fixedstr.Length + 37 + user.Length + pass.Length + workport.Length + port.Length) LogSend[i] = 0; 63 | else LogSend[i] = 48; 64 | } 65 | if (i >= fixedstr.Length + 44 + user.Length + pass.Length + workport.Length + port.Length && i < 162) 66 | { 67 | LogSend[i] = 0; 68 | } 69 | } 70 | return LogSend; 71 | } 72 | #endregion 73 | 74 | #region 发送指令编码 75 | //string userid//表示服务器返回回来的客户端应该:比如51,81//strinstruct指的是命令 76 | public byte[] MakeInstruct(byte[] userid, string strinstruct) 77 | { 78 | byte[] order = MiddleToCode(strinstruct); 79 | int leng = order.Length + 21; 80 | byte[] instruct = new byte[leng]; 81 | instruct = StartAndEnd(instruct, leng, userid); 82 | for (int i = 19; i < leng-2; i++) 83 | { 84 | instruct[i] = order[i - 19]; 85 | } 86 | return instruct; 87 | } 88 | #region 命令的开头和结尾 89 | private byte[] StartAndEnd(byte[] instruct,int length,byte[] userid) 90 | { 91 | instruct[0] = 1; 92 | instruct[1] = 0; 93 | instruct[2] = 0; 94 | instruct[3] = (byte)length; 95 | instruct[4] = 0; 96 | instruct[5] = 0; 97 | instruct[6] = 0; 98 | instruct[7] = 1; 99 | instruct[8] = userid[0]; 100 | instruct[9] = userid[1]; 101 | instruct[10] = 112; 102 | instruct[11] = 2; 103 | instruct[12] = 27; 104 | instruct[13] = 11; 105 | instruct[14] = 44;//光标的位置,随便写吧 106 | instruct[15] = 32;//同上 107 | instruct[16] = 0; 108 | instruct[17] = 15; 109 | instruct[18] = 30;//表示内容的开始 110 | instruct[length - 2] = 32; 111 | instruct[length - 1] = 3; 112 | return instruct; 113 | } 114 | #endregion 115 | 116 | #region 汉字编码 117 | public static byte[] ChineseToCode(string name) 118 | { 119 | string pinyin = ChineseToPinyin.ToPinYin(name); 120 | byte[] pinbyte = Encoding.ASCII.GetBytes(pinyin); 121 | byte[] middle = Encoding.GetEncoding("gb2312").GetBytes(name); 122 | byte[] chinesebyte = new byte[middle.Length]; 123 | byte[] chinesecode = new byte[pinbyte.Length + middle.Length + 4]; 124 | for (int i = 0; i < middle.Length; i++) 125 | { 126 | chinesebyte[i] = (byte)(middle[i] - 128); 127 | } 128 | for (int i = 0; i < pinbyte.Length + 2; i++) 129 | { 130 | if (i == pinbyte.Length) chinesecode[i] = 27; 131 | else if (i == pinbyte.Length + 1) chinesecode[i] = 14; 132 | else 133 | chinesecode[i] = pinbyte[i]; 134 | } 135 | for (int j = pinbyte.Length + 2; j < pinbyte.Length + chinesebyte.Length + 4; j++) 136 | { 137 | if (j == pinbyte.Length + chinesebyte.Length + 2) chinesecode[j] = 27; 138 | else if (j == pinbyte.Length + chinesebyte.Length + 3) chinesecode[j] = 15; 139 | else 140 | chinesecode[j] = chinesebyte[j - pinbyte.Length - 2]; 141 | } 142 | return chinesecode; 143 | } 144 | #endregion 145 | 146 | #region 中间部分的命令编码(其中是可以有字母加汉字的) 147 | public byte[] MiddleToCode(string str) 148 | { 149 | System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"(?[\u4E00-\u9FA5]{2,9})"); 150 | var matches = regex.Matches(str); 151 | List strChinese = new List(); 152 | List location = new List();//起始位置 153 | List strPin = new List(); //表示汉字转拼音 154 | foreach(System.Text.RegularExpressions.Match item in matches) 155 | { 156 | string fir = item.Groups["UserName"].Value; 157 | int first = str.IndexOf(fir); 158 | location.Add(first);//记录这个名字的地址 159 | int strlenth = fir.Length; 160 | location.Add(first+strlenth); 161 | strChinese.Add(fir); 162 | }//找出有汉字的部分 163 | 164 | List subStr = new List(); 165 | if (location.Count() > 0)//表示有汉字 166 | { 167 | string sec = str.Substring(0, location[0]); 168 | subStr.Add(sec); 169 | for (int i = 0; i < location.Count; i ++) 170 | { 171 | if (i + 1 >= location.Count) 172 | { 173 | if (location[i]== str.Length) break; 174 | else 175 | { 176 | string stt = str.Substring(location[i]); 177 | subStr.Add(stt); 178 | } 179 | } 180 | else 181 | { 182 | string stt = str.Substring(location[i], location[i + 1] - location[i]);// 183 | subStr.Add(stt); 184 | } 185 | } 186 | } 187 | else //表示没有汉字 188 | { 189 | subStr.Add(str); 190 | } 191 | int m=0; 192 | List list = new List(); 193 | List leng = new List(); 194 | for (int i = 0; i < subStr.Count(); i++) 195 | { 196 | if (strChinese.Count() > 0)//表示有汉字 197 | { 198 | if (m >= strChinese.Count) m--; 199 | if (subStr[i] != strChinese[m]) 200 | { 201 | byte[] first = Encoding.ASCII.GetBytes(subStr[i]); 202 | int count = first.Length; 203 | list.Add(first); 204 | leng.Add(count); 205 | } 206 | else //汉字 207 | { 208 | byte[] first = ChineseToCode(strChinese[m]); 209 | m++; 210 | int count = first.Length; 211 | list.Add(first); 212 | leng.Add(count); 213 | } 214 | } 215 | else //表示没有汉字 216 | { 217 | byte[] first = Encoding.ASCII.GetBytes(subStr[i]); 218 | int count = first.Length; 219 | list.Add(first); 220 | leng.Add(count); 221 | } 222 | 223 | }//进行字符串转字节码 224 | 225 | int allleng = 0; 226 | foreach(var item in leng) 227 | { 228 | allleng += item; 229 | }//算出最终要申请的存储空间 230 | 231 | byte[] rtn=new byte[allleng]; 232 | int t = 0; 233 | foreach(var item in list) 234 | { 235 | for (int i = 0; i < item.Length;i++ ) 236 | { 237 | rtn[t] = item[i]; 238 | t++; 239 | } 240 | } 241 | return rtn; 242 | } 243 | #endregion 244 | #endregion 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /ETermSimulator/EncodeMachine.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | 7 | namespace ETermSimulator 8 | { 9 | public class EncodeMachine 10 | { 11 | //1.登陆编码 12 | //2.指令登陆 13 | #region 登陆编码 14 | public byte[] LogEncode(string user,string password,string mac,string ip,string version ) 15 | { 16 | byte[] headArray = new byte[2] { 1, 0 };//instruction head,include head and length 17 | byte[] userArray = new byte[16];//eTerm Username 18 | Encoding.ASCII.GetBytes(user).CopyTo(userArray, 0); 19 | byte[] passwordArray = new byte[32];//eTerm password 20 | Encoding.ASCII.GetBytes(password).CopyTo(passwordArray, 0); 21 | byte[] macArray = new byte[12];//eTerm client mac address 22 | Encoding.ASCII.GetBytes(mac).CopyTo(macArray, 0); 23 | byte[] ipArray = new byte[15];//eTerm client ip address 24 | Encoding.ASCII.GetBytes(ip).CopyTo(ipArray, 0); 25 | byte[] versionArray = new byte[8];//eTerm Version 26 | Encoding.ASCII.GetBytes(version).CopyTo(versionArray, 0); 27 | byte[] unKnownArray = new byte[77];//don't know 28 | Encoding.ASCII.GetBytes("000000").CopyTo(unKnownArray, 0); 29 | 30 | var rtnValue = headArray.Concat(userArray).Concat(passwordArray).Concat(macArray).Concat(ipArray).Concat(versionArray).Concat(unKnownArray).ToArray(); 31 | rtnValue[1] = (byte)rtnValue.Length;//update the instruction length 32 | return rtnValue; 33 | 34 | 35 | //string fixstr = "3847010"; 36 | //byte[] LogSend = new byte[162]; 37 | //byte[] user = System.Text.Encoding.Default.GetBytes(userName); 38 | //byte[] pass = System.Text.Encoding.Default.GetBytes(password); 39 | //byte[] port = System.Text.Encoding.Default.GetBytes(strport);//这个后 40 | //byte[] workport = System.Text.Encoding.Default.GetBytes(strworkport);//这个先 41 | //byte[] fixedstr = System.Text.Encoding.Default.GetBytes(fixstr);// 42 | //user.Concat( 43 | //for (int i = 0; i < 162; i++) 44 | //{ 45 | // if (i == 0) LogSend[i] = 1; 46 | // if (i == 1) LogSend[i] = 162; 47 | // if (i > 1 && i < 2 + user.Length) //填充密码 48 | // { 49 | // LogSend[i] = user[i - 2]; 50 | // } 51 | // if (i >= user.Length + 2 && i < 2 + user.Length + 8) //填充8个0 52 | // { 53 | // LogSend[i] = 0; 54 | // } 55 | // if (i >= 10 + user.Length && i < 10 + user.Length + pass.Length)//填充密码 56 | // { 57 | // LogSend[i] = pass[i - user.Length - 10]; 58 | // } 59 | // if (i >= 10 + user.Length + pass.Length && i < 35 + user.Length + pass.Length) //填充后面的25个0 60 | // { 61 | // LogSend[i] = 0; 62 | // } 63 | // if (i >= 35 + user.Length + pass.Length && i < 35 + user.Length + pass.Length + workport.Length)//填充端口号前面的 64 | // { 65 | // LogSend[i] = workport[i - 35 - user.Length - pass.Length]; 66 | // } 67 | // if (i >= 35 + user.Length + pass.Length + workport.Length && i < 35 + user.Length + pass.Length + workport.Length + port.Length) //填充端口号 68 | // { 69 | // LogSend[i] = port[i - 35 - user.Length - pass.Length - workport.Length]; 70 | // } 71 | // if (i >= 35 + user.Length + pass.Length + workport.Length + port.Length && i < 37 + user.Length + pass.Length + workport.Length + port.Length) //后面添加两个空格 72 | // { 73 | // LogSend[i] = 32; 74 | // } 75 | // if (i >= 37 + user.Length + pass.Length + workport.Length + port.Length && i < fixedstr.Length + 37 + user.Length + pass.Length + workport.Length + port.Length)//添加3847010 76 | // { 77 | // LogSend[i] = fixedstr[i - 37 - user.Length - pass.Length - workport.Length - port.Length]; 78 | // }//还要填写6个0 79 | // if (i >= fixedstr.Length + 37 + user.Length + pass.Length + workport.Length + port.Length && i < fixedstr.Length + 44 + user.Length + pass.Length + workport.Length + port.Length) 80 | // { 81 | // if (i == fixedstr.Length + 37 + user.Length + pass.Length + workport.Length + port.Length) LogSend[i] = 0; 82 | // else LogSend[i] = 48; 83 | // } 84 | // if (i >= fixedstr.Length + 44 + user.Length + pass.Length + workport.Length + port.Length && i < 162) 85 | // { 86 | // LogSend[i] = 0; 87 | // } 88 | //} 89 | //return LogSend; 90 | } 91 | #endregion 92 | 93 | #region 发送指令编码 94 | //string userid//表示服务器返回回来的客户端应该:比如51,81//strinstruct指的是命令 95 | public byte[] MakeInstruct(byte[] userid, string strinstruct) 96 | { 97 | byte[] order = MiddleToCode(strinstruct); 98 | int leng = order.Length + 21; 99 | byte[] instruct = new byte[leng]; 100 | instruct = StartAndEnd(instruct, leng, userid); 101 | for (int i = 19; i < leng-2; i++) 102 | { 103 | instruct[i] = order[i - 19]; 104 | } 105 | return instruct; 106 | } 107 | #region 命令的开头和结尾 108 | private byte[] StartAndEnd(byte[] instruct,int length,byte[] userid) 109 | { 110 | instruct[0] = 1; 111 | instruct[1] = 0; 112 | instruct[2] = 0; 113 | instruct[3] = (byte)length; 114 | instruct[4] = 0; 115 | instruct[5] = 0; 116 | instruct[6] = 0; 117 | instruct[7] = 1; 118 | instruct[8] = userid[0]; 119 | instruct[9] = userid[1]; 120 | instruct[10] = 112; 121 | instruct[11] = 2; 122 | instruct[12] = 27; 123 | instruct[13] = 11; 124 | instruct[14] = 44;//光标的位置,随便写吧 125 | instruct[15] = 32;//同上 126 | instruct[16] = 0; 127 | instruct[17] = 15; 128 | instruct[18] = 30;//表示内容的开始 129 | instruct[length - 2] = 32; 130 | instruct[length - 1] = 3; 131 | return instruct; 132 | } 133 | #endregion 134 | 135 | #region 汉字编码 136 | public static byte[] ChineseToCode(string name) 137 | { 138 | string pinyin = ChineseToPinyin.ToPinYin(name); 139 | byte[] pinbyte = Encoding.ASCII.GetBytes(pinyin); 140 | byte[] middle = Encoding.GetEncoding("gb2312").GetBytes(name); 141 | byte[] chinesebyte = new byte[middle.Length]; 142 | byte[] chinesecode = new byte[pinbyte.Length + middle.Length + 4]; 143 | for (int i = 0; i < middle.Length; i++) 144 | { 145 | chinesebyte[i] = (byte)(middle[i] - 128); 146 | } 147 | for (int i = 0; i < pinbyte.Length + 2; i++) 148 | { 149 | if (i == pinbyte.Length) chinesecode[i] = 27; 150 | else if (i == pinbyte.Length + 1) chinesecode[i] = 14; 151 | else 152 | chinesecode[i] = pinbyte[i]; 153 | } 154 | for (int j = pinbyte.Length + 2; j < pinbyte.Length + chinesebyte.Length + 4; j++) 155 | { 156 | if (j == pinbyte.Length + chinesebyte.Length + 2) chinesecode[j] = 27; 157 | else if (j == pinbyte.Length + chinesebyte.Length + 3) chinesecode[j] = 15; 158 | else 159 | chinesecode[j] = chinesebyte[j - pinbyte.Length - 2]; 160 | } 161 | return chinesecode; 162 | } 163 | #endregion 164 | 165 | #region 中间部分的命令编码(其中是可以有字母加汉字的) 166 | public byte[] MiddleToCode(string str) 167 | { 168 | System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"(?[\u4E00-\u9FA5]{2,9})"); 169 | var matches = regex.Matches(str); 170 | List strChinese = new List(); 171 | List location = new List();//起始位置 172 | List strPin = new List(); //表示汉字转拼音 173 | foreach(System.Text.RegularExpressions.Match item in matches) 174 | { 175 | string fir = item.Groups["UserName"].Value; 176 | int first = str.IndexOf(fir); 177 | location.Add(first);//记录这个名字的地址 178 | int strlenth = fir.Length; 179 | location.Add(first+strlenth); 180 | strChinese.Add(fir); 181 | }//找出有汉字的部分 182 | 183 | List subStr = new List(); 184 | if (location.Count() > 0)//表示有汉字 185 | { 186 | string sec = str.Substring(0, location[0]); 187 | subStr.Add(sec); 188 | for (int i = 0; i < location.Count; i ++) 189 | { 190 | if (i + 1 >= location.Count) 191 | { 192 | if (location[i]== str.Length) break; 193 | else 194 | { 195 | string stt = str.Substring(location[i]); 196 | subStr.Add(stt); 197 | } 198 | } 199 | else 200 | { 201 | string stt = str.Substring(location[i], location[i + 1] - location[i]);// 202 | subStr.Add(stt); 203 | } 204 | } 205 | } 206 | else //表示没有汉字 207 | { 208 | subStr.Add(str); 209 | } 210 | int m=0; 211 | List list = new List(); 212 | List leng = new List(); 213 | for (int i = 0; i < subStr.Count(); i++) 214 | { 215 | if (strChinese.Count() > 0)//表示有汉字 216 | { 217 | if (m >= strChinese.Count) m--; 218 | if (subStr[i] != strChinese[m]) 219 | { 220 | byte[] first = Encoding.ASCII.GetBytes(subStr[i]); 221 | int count = first.Length; 222 | list.Add(first); 223 | leng.Add(count); 224 | } 225 | else //汉字 226 | { 227 | byte[] first = ChineseToCode(strChinese[m]); 228 | m++; 229 | int count = first.Length; 230 | list.Add(first); 231 | leng.Add(count); 232 | } 233 | } 234 | else //表示没有汉字 235 | { 236 | byte[] first = Encoding.ASCII.GetBytes(subStr[i]); 237 | int count = first.Length; 238 | list.Add(first); 239 | leng.Add(count); 240 | } 241 | 242 | }//进行字符串转字节码 243 | 244 | int allleng = 0; 245 | foreach(var item in leng) 246 | { 247 | allleng += item; 248 | }//算出最终要申请的存储空间 249 | 250 | byte[] rtn=new byte[allleng]; 251 | int t = 0; 252 | foreach(var item in list) 253 | { 254 | for (int i = 0; i < item.Length;i++ ) 255 | { 256 | rtn[t] = item[i]; 257 | t++; 258 | } 259 | } 260 | return rtn; 261 | } 262 | #endregion 263 | 264 | 265 | #endregion 266 | 267 | #region 268 | public byte[] TestA() 269 | { 270 | byte[] firstTest = { 1, 254, 0, 17, 20, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 271 | return firstTest; 272 | } 273 | #endregion 274 | #region 第二组测试 275 | public byte[] TestB() 276 | { 277 | byte[] secondTest = { 1, 254, 0, 17, 20, 16, 0, 2, 12, 0, 0, 0, 0, 0, 0, 0, 0, 1, 254, 0, 17, 20, 16, 0, 2, 41, 0, 0, 0, 0, 0, 0, 0, 0, 1, 254, 0, 17, 20, 16, 0, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0 }; 278 | return secondTest; 279 | } 280 | #endregion 281 | } 282 | } 283 | -------------------------------------------------------------------------------- /ConsoleApp/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using ConsoleApp; 6 | 7 | namespace ConsoleApp 8 | { 9 | class Program 10 | { 11 | static void Main(string[] args) 12 | { 13 | //==============测试汉字转成字节================== 14 | //var bc = CTOC(); 15 | //byte[] bb = { 73,79,58,35,53,88,71,120,76,108,70,120,84,36,35,40}; 16 | //var we = TransToChinese(bb); 17 | //var cc = we; 18 | ////string str = "liuyanjia刘艳佳2222333sss李四sss王五"; 19 | //============这个是组装字节的================================== 20 | //string test2 = "1 0 1 178 0 0 0 1 39 81 112 2 27 11 40 32 15 27 77 27 14 73 79 58 35 53 88 71 120 76 108 70 120 84 36 49 40 27 15 58 32 32 32 13 32 32 32 32 32 57 27 14 84 66 27 15 50 50 27 14 72 85 27 15 32 27 14 80 71 70 90 72 85 27 15 58 13 32 32 32 32 32 32 32 32 27 14 87 110 53 77 70 120 78 66 27 15 32 50 53 67 40 55 55 70 41 44 32 27 14 87 110 56 95 70 120 78 66 27 15 32 50 57 67 40 56 52 70 41 44 32 27 14 85 115 83 106 27 15 44 32 27 14 54 43 55 103 27 15 52 45 53 27 14 60 54 27 15 32 13 32 32 32 32 32 32 57 27 14 84 66 27 15 50 51 27 14 72 85 27 15 32 27 14 80 71 70 90 82 59 27 15 58 13 32 32 32 32 32 32 32 32 27 14 87 110 53 77 70 120 78 66 27 15 32 50 52 67 40 55 53 70 41 44 32 27 14 87 110 56 95 70 120 78 66 27 15 32 51 48 67 40 56 54 70 41 44 32 27 14 54 96 84 70 27 15 44 32 27 14 54 43 68 79 55 103 27 15 52 45 53 27 14 60 54 27 15 32 13 32 32 32 32 32 32 32 32 57 27 14 84 66 27 15 50 52 27 14 72 85 27 15 32 27 14 80 71 70 90 54 126 27 15 58 13 32 32 32 32 32 32 32 32 27 14 87 110 53 77 70 120 78 66 27 15 32 50 49 67 40 55 48 70 41 44 32 27 14 87 110 56 95 70 120 78 66 27 15 32 51 48 67 40 56 54 70 41 44 32 27 14 85 115 83 106 87 42 86 80 83 106 27 15 44 32 27 14 68 79 55 103 27 15 52 45 53 27 14 60 54 87 42 54 43 39 35 55 103 27 15 52 45 53 27 14 60 54 27 15 32 13 32 32 32 32 32 32 27 98 13 30 27 98 3"; 21 | //var test2a = GetNewStr(test2); 22 | //var sssss = test2a; 23 | //============================================================ 24 | byte[] test1 = //这个是avshacgo 25 | { 26 | 1 ,0 ,3, 103, 0, 0, 0, 1, 51, 81, 112, 2, 27, 11, 32, 32, 15 ,27 ,77, 32, 50, 49, 83, 69, 80, 40, 83, 65, 84, 27 | 41, 32 ,83 ,72, 65, 67 ,71 ,79 ,32 ,13 ,49, 45, 32 ,42 ,77, 85, 57, 51, 50 ,51 ,32 ,32, 83 ,72 ,65, 67 ,71 ,79, 28 | 32 ,49, 55, 53 ,53, 32 ,32 ,32,49, 57, 52 ,53, 32, 32 ,32 ,55 ,51 ,55 ,32 ,48, 94, 68, 32, 32, 69, 32, 32, 28, 29 | 65, 83, 35, 29, 70 ,76 ,32 ,80, 81, 32, 65 ,76, 32, 89, 76, 32, 66, 81 ,32 ,77 ,81, 32, 69, 81 ,32, 72, 81, 32, 30 | 75 ,81 ,32 ,76 ,81 ,42 ,50 ,32 ,32 ,32 ,70 ,77 ,57 ,51 ,50, 51, 32, 32 ,83, 72, 65, 67, 71, 79, 32, 49, 55, 53, 31 | 53 ,32 ,32 ,32 ,49 ,57 ,52 ,53 ,32 ,32 ,32, 55, 51, 55, 32, 48, 94, 68, 32, 32, 69, 32, 32, 28, 65, 83, 35, 29, 32 | 70 ,76, 32, 80, 81 ,32 ,89 ,76 ,32 ,66 ,81 ,32 ,77 ,81 ,32 ,69 ,81 ,32 ,72 ,81 ,32 ,75, 81 ,32 ,76 ,81 ,32 ,78, 33 | 81 ,42 ,51 ,32 ,32 ,32 ,67 ,90 ,51 ,53 ,57 ,56 ,32 ,32 ,83 ,72 ,65 ,67 ,71 ,79 ,32 ,50 ,48 ,51 ,48 ,32 ,32 ,32, 34 | 50 ,50 ,50 ,48 ,32 ,32 ,32 ,55 ,51 ,56 ,32 ,48 ,94 ,67 ,32 ,32 ,69 ,32 ,32 ,28 ,65 ,83 ,35 ,29 ,70 ,50 ,32 ,80 , 35 | 81 ,32 ,87 ,76 ,32 ,90 ,81 ,32 ,89 ,76 ,32 ,84 ,81 ,32 ,75 ,81 ,32 ,72 ,81 ,32 ,77 ,81 ,32 ,71 ,81 ,42 ,52 ,32 , 36 | 32 ,32 ,70 ,77 ,56 ,50 ,50 ,32 ,32 ,32 ,80 ,86 ,71 ,67 ,71 ,79 ,32 ,50 ,49 ,52 ,48 ,32 ,32 ,32 ,50 ,51 ,51 ,48 , 37 | 32 ,32 ,32 ,55 ,51 ,56 ,32 ,48 ,94, 32, 32 ,32 ,69 ,32 ,32 ,32 ,68 ,83 ,35 ,32 ,74 ,50 ,32 ,67 ,81 ,32 ,68 ,81 , 38 | 32 ,73, 81, 32, 89, 76 ,32 ,66 ,81 ,32 ,77 ,81 ,32 ,69 ,81 ,32 ,72 ,81 ,32 ,75 ,81 ,42 ,53 ,32 ,32 ,42 ,77 ,85 , 39 | 51 ,51 ,50 ,49 ,32 ,32 ,80 ,86 ,71 ,67 ,71 ,79 ,32 ,50 ,50 ,49 ,48 ,32 ,32 ,32 ,50 ,51, 53, 53, 32 ,32 ,32 ,55 , 40 | 51 ,56 ,32 ,48 ,94 ,67 ,32 ,32 ,69 ,32 ,32 ,28 ,65 ,83 ,35 ,29 ,89 ,65 ,32 ,66 ,65 ,32 ,77 ,65 ,32 ,69 ,65 ,32 , 41 | 72 ,81 ,32 ,75 ,81 ,32 ,76 ,81 ,32 ,78 ,81 ,32 ,82 ,81 ,32 ,83 ,81 ,42 ,54 ,32 ,32, 32, 67, 90, 51, 57, 52, 56, 42 | 32 ,32 ,80 ,86 ,71 ,67 ,71 ,79 ,32 ,50 ,50 ,49 ,48 ,32 ,32 ,32 ,50 ,51 ,53 ,53 ,32 ,32 ,32 ,55 ,51 ,56 ,32 ,48 , 43 | 94 ,67, 32, 32 ,69 ,32 ,32 ,28 ,65 ,83 ,35 ,29 ,70 ,49 ,32 ,80 ,49 ,32 ,87 ,53 ,32 ,90 ,53 ,32 ,89 ,65 ,32 ,84 , 44 | 65 ,32 ,75 ,65 ,32 ,72 ,65 ,32 ,77 ,81 ,32 ,71 ,81 ,42 ,55 ,43 ,32 ,32 ,67 ,90 ,51 ,53 ,50 ,54 ,32 ,32 ,83 ,72 , 45 | 65 ,67, 65 ,78 ,32 ,49 ,54 ,52 ,53 ,32 ,32 ,32 ,49 ,57 ,48 ,53 ,32 ,32 ,32 ,51 ,50 ,49 ,32 ,48 ,94 ,67 ,32 ,32 , 46 | 69 ,32, 32, 32, 68 ,83 ,35 ,32 ,70 ,52 ,32 ,80 ,83 ,32 ,87 ,65 ,32 ,90 ,81 ,32 ,89 ,65, 32, 84, 81, 32, 75, 81 , 47 | 32 ,72 ,81 ,32 ,77 ,81 ,32 ,71 ,81 ,42 ,32 ,32 ,32 ,32 ,67 ,90 ,51 ,49 ,57 ,54 ,32 ,32 ,32 ,32 ,32 ,67 ,71 ,79 , 48 | 32 ,50 ,50 ,48 ,48 ,32 ,32 ,32 ,48 ,48 ,49 ,53 ,43 ,49 ,32 ,55 ,51 ,56, 32, 48 ,94 ,67 ,32 ,32 ,69 ,32, 32, 28 , 49 | 65 ,83 ,35 ,29 ,70 ,76 ,32 ,80 ,76 ,32 ,87 ,76 ,32 ,90 ,81 ,32 ,89 ,76 ,32 ,84 ,81 ,32 ,75 ,81 ,32 ,72 ,81 ,32 , 50 | 77, 81 ,32 ,71, 81 ,42 ,28 ,42, 42, 32, 32, 65, 108 ,108, 32 ,115, 99, 104 ,101 ,100, 117 ,108 ,101 ,100 ,32 ,77, 51 | 85 ,32, 111, 114, 32 ,70, 77, 52 | 32, 102, 108 ,105, 103, 104, 116, 115, 32 ,111, 112, 101, 114 ,97 ,116, 101, 100 ,32 ,98 ,121, 32, 77 ,85 ,32, 111, 114, 53 | 32 ,70, 77, 32 ,97 ,114, 54 | 101, 32 ,34 ,69 ,97 ,115 ,116 ,101 ,114 ,110 ,32 ,69 ,120 ,112 ,114, 101, 115 ,115 ,34 ,29 ,13 ,28 ,42 ,42 ,32 ,32, 72 , 55 | 79 ,32, 70 ,76 ,73 ,71, 56 | 72 ,84 ,32 ,68, 69, 80, 65 ,82 ,84 ,85, 82 ,69, 47, 65, 82, 82, 73 ,86, 65, 76 ,32, 65, 84 ,32 ,80, 86 ,71, 32 ,84, 50 , 57 | 32, 70, 82 ,79 ,77 ,32, 49 , 58 | 56, 68, 69, 67, 49 ,50, 44, 29, 13 ,28 ,42, 42, 32 ,32 ,72 ,79, 32 ,80, 86, 71 ,32, 67 ,72 ,69 ,67, 75, 32 ,73, 78 ,32 , 59 | 52 ,53 ,32 ,77 ,73 ,78, 85, 60 | 84, 69 ,83 ,32 ,66 ,69, 70 ,79 ,82, 69 ,32 ,68 ,69, 80 ,65, 82, 84, 85, 82, 69 ,29, 13, 30, 27, 98, 3 61 | }; 62 | byte[] test =//天气预报 63 | { 64 | 1,0,1,178,0,0,0,1,39,81,112,2,27,11,40,32,15,27,77,27,14,73,79,58,35,53,88,71,120,76,108,70,120,84,36,49,40,27,15,58,32,32,32,13,32,32,32,32,32,57,27,14,84,66,27,15,50,50,27,14,72,85,27,15,32,27,14,80,71,70,90,72,85,27,15,58,13,32,32,32,32,32,32,32,32,27,14,87,110,53,77,70,120,78,66,27,15,32,50,53,67,40,55,55,70,41,44,32,27,14,87,110,56,95,70,120,78,66,27,15,32,50,57,67,40,56,52,70,41,44,32,27,14,85,115,83,106,27,15,44,32,27,14,54,43,55,103,27,15,52,45,53,27,14,60,54,27,15,32,13,32,32,32,32,32,32,57,27,14,84,66,27,15,50,51,27,14,72,85,27,15,32,27,14,80,71,70,90,82,59,27,15,58,13,32,32,32,32,32,32,32,32,27,14,87,110,53,77,70,120,78,66,27,15,32,50,52,67,40,55,53,70,41,44,32,27,14,87,110,56,95,70,120,78,66,27,15,32,51,48,67,40,56,54,70,41,44,32,27,14,54,96,84,70,27,15,44,32,27,14,54,43,68,79,55,103,27,15,52,45,53,27,14,60,54,27,15,32,13,32,32,32,32,32,32,32,32,57,27,14,84,66,27,15,50,52,27,14,72,85,27,15,32,27,14,80,71,70,90,54,126,27,15,58,13,32,32,32,32,32,32,32,32,27,14,87,110,53,77,70,120,78,66,27,15,32,50,49,67,40,55,48,70,41,44,32,27,14,87,110,56,95,70,120,78,66,27,15,32,51,48,67,40,56,54,70,41,44,32,27,14,85,115,83,106,87,42,86,80,83,106,27,15,44,32,27,14,68,79,55,103,27,15,52,45,53,27,14,60,54,87,42,54,43,39,35,55,103,27,15,52,45,53,27,14,60,54,27,15,32,13,32,32,32,32,32,32,27,98,13,30,27,98,3 65 | }; 66 | string stra = OrderService(test); 67 | string[] testa = stra.Split('~'); 68 | foreach(var item in testa) 69 | { 70 | int a = item.IndexOf("\0"); 71 | string q2 = item.Substring(0,a+1);//那就在这个地方处理情况了 72 | Console.WriteLine(q2); 73 | } 74 | 75 | string str = "detr:nm/ 刘艳佳1"; 76 | //System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"(?[\u4E00-\u9FA5]{2,9})"); 77 | //var matches = regex.Matches(str); 78 | //List strName = new List(); 79 | //List location = new List();//起始位置 80 | //List strPin = new List(); //表示汉字转拼音 81 | //foreach(System.Text.RegularExpressions.Match item in matches) 82 | //{ 83 | // string fir = item.Groups["UserName"].Value; 84 | // int first = str.IndexOf(fir); 85 | // location.Add(first);//记录这个名字的地址 86 | // int strlenth = fir.Length; 87 | // location.Add(strlenth); 88 | // strName.Add(fir); 89 | //}//上面的数组里面全是有汉字的 90 | 91 | ////把这个字符串截取一段一段: 92 | //List sub = new List(); 93 | //string sec = str.Substring(0, location[0]); 94 | //sub.Add(sec); 95 | //for (int i = 0; i < location.Count();i+=2 ) 96 | //{ 97 | // string stt = str.Substring(location[i], location[i + 1]); 98 | // sub.Add(stt); 99 | //}//sub把所有的都截取出来了。 100 | 101 | //int m=0; 102 | //List list = new List(); 103 | //List leng = new List(); 104 | //for (int i = 0; i < sub.Count(); i++) 105 | //{ 106 | // if (sub[i] != strName[m]) 107 | // { 108 | // byte[] first = Encoding.ASCII.GetBytes(sub[i]); 109 | // int count = first.Length; 110 | // list.Add(first); 111 | // leng.Add(count); 112 | // } 113 | // else //汉字 114 | // { 115 | // byte[] first = ChineseToCode(strName[m]); 116 | // m++; 117 | // int count = first.Length; 118 | // list.Add(first); 119 | // leng.Add(count); 120 | // } 121 | //}//进行字符串转字节码 122 | 123 | //int allleng = 0; 124 | //foreach(var item in leng) 125 | //{ 126 | // allleng += item; 127 | //}//算出最终要申请的存储空间 128 | 129 | //byte[] rtn=new byte[allleng]; 130 | //int t = 0; 131 | //foreach(var item in list) 132 | //{ 133 | // for (int i = 0; i < item.Length;i++ ) 134 | // { 135 | // rtn[t] = item[i]; 136 | // t++; 137 | // } 138 | //} 139 | //var aa = rtn; 140 | 141 | } 142 | //做这样一个原始的东西感觉上挺好的。 143 | #region 汉字编码 144 | public static byte[] ChineseToCode(string name) 145 | { 146 | string pinyin = ChineseToPinyin.ToPinYin(name); 147 | byte[] pinbyte = Encoding.ASCII.GetBytes(pinyin); 148 | byte[] middle = Encoding.GetEncoding("gb2312").GetBytes(name); 149 | byte[] chinesebyte = new byte[middle.Length]; 150 | byte[] chinesecode = new byte[pinbyte.Length + middle.Length + 4]; 151 | for (int i = 0; i < middle.Length; i++) 152 | { 153 | chinesebyte[i] = (byte)(middle[i] - 128); 154 | } 155 | for (int i = 0; i < pinbyte.Length + 2; i++) 156 | { 157 | if (i == pinbyte.Length) chinesecode[i] = 27; 158 | else if (i == pinbyte.Length + 1) chinesecode[i] = 14; 159 | else 160 | chinesecode[i] = pinbyte[i]; 161 | } 162 | for (int j = pinbyte.Length + 2; j < pinbyte.Length + chinesebyte.Length + 4; j++) 163 | { 164 | if (j == pinbyte.Length + chinesebyte.Length + 2) chinesecode[j] = 27; 165 | else if (j == pinbyte.Length + chinesebyte.Length + 3) chinesecode[j] = 15; 166 | else 167 | chinesecode[j] = chinesebyte[j - pinbyte.Length - 2]; 168 | } 169 | return chinesecode; 170 | } 171 | #endregion 172 | #region 根据gb2312转汉字 173 | private static string TransToChinese(byte[] toChinese) 174 | { 175 | string str = ""; 176 | byte[] arry = new byte[2]; 177 | for (int i = 0; i < toChinese.Length; i++) 178 | { 179 | toChinese[i] = (byte)(toChinese[i] + 128); 180 | } 181 | for (int i = 0; i < toChinese.Length-1; i += 2) 182 | { 183 | arry[0] = toChinese[i]; 184 | arry[1] = toChinese[i + 1]; 185 | str += System.Text.Encoding.GetEncoding("gb2312").GetString(arry); 186 | } 187 | return str; 188 | } 189 | 190 | private static string TransToCode(byte[] toCode) 191 | { 192 | string str = System.Text.Encoding.Default.GetString(toCode); 193 | return str; 194 | } 195 | public static byte[] CTOC() 196 | { 197 | string name="上海地区天气预报"; 198 | byte[] aa = System.Text.Encoding.GetEncoding("gb2312").GetBytes(name); 199 | for (int i = 0; i < aa.Length;i++ ) 200 | { 201 | aa[i] = (byte)(aa[i] - 128); 202 | } 203 | return aa; 204 | } 205 | #region 表示解析普通命令 206 | public static string OrderService(byte[] receiveService) 207 | { 208 | string rtn=""; int max=0; 209 | Byte[] chineseCode = new byte[100]; 210 | int start = 0;//标记解析的开始 211 | for (int i = 0; i < receiveService.Length;i++ ) 212 | { 213 | if (receiveService[i] == 77 && receiveService[i-1] == 27) 214 | { 215 | start = i; 216 | break; 217 | } 218 | } 219 | for (int i = start+1; i < receiveService.Length; i++) //控制长度 220 | { 221 | if (receiveService[i] == 13) 222 | { 223 | max = i; 224 | break; 225 | } 226 | } 227 | Byte[] code = new byte[max]; 228 | bool value = false; 229 | int m = 0;//相当于chineseCode的指针 230 | int n = 0;//相当于code的指针 231 | for (int i = 19; i < receiveService.Length; i++) 232 | { 233 | 234 | if (receiveService[i] < 32) 235 | { 236 | //表示特殊字符 237 | if (receiveService[i] == 13) 238 | { 239 | rtn += TransToCode(code) + "~"; 240 | int longth =0; 241 | for(int j=i+1;j= 32) 344 | { 345 | if (receiveService[i] == 43) 346 | { 347 | // rtn += "当前的内容没有显示完"; 348 | } 349 | if (receiveService[i] == 98 && receiveService[i - 1] == 27) 350 | { 351 | continue;//这个是显示不出来内容的。 352 | } 353 | if (value == true) 354 | { 355 | chineseCode[m] = receiveService[i]; 356 | m++; 357 | } 358 | else if (value == false) 359 | { 360 | code[n] = receiveService[i]; 361 | n++; 362 | } 363 | } 364 | 365 | } 366 | return rtn; 367 | } 368 | #endregion 369 | #endregion 370 | #region 将字符串添加逗号 371 | public static string GetNewStr(string str) 372 | { 373 | string aa = str.Replace(" ",","); 374 | return aa; 375 | } 376 | #endregion 377 | 378 | #region 显示是否可以重新new出一个空间 379 | public static void Test() 380 | { 381 | byte[] aa = new byte[20]; 382 | string test = "ttt"; 383 | string test1 = "aaa"; 384 | aa = System.Text.Encoding.Default.GetBytes(test); 385 | foreach (var item in aa) 386 | { 387 | Console.WriteLine(item); 388 | } 389 | aa=new byte[10]; 390 | aa = System.Text.Encoding.Default.GetBytes(test1); 391 | foreach(var item in aa) 392 | { 393 | Console.WriteLine(item); 394 | } 395 | } 396 | #endregion 397 | } 398 | } 399 | -------------------------------------------------------------------------------- /ConsoleApp/ChineseSpell.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | 6 | namespace ConsoleApp 7 | { 8 | public class ChineseSpell 9 | { 10 | private static string strChineseFirstPY = 11 | "YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJ" 12 | + "HHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPC" 13 | + "BZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZ" 14 | + "ZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZ" 15 | + "XYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXP" 16 | + "JBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCS" 17 | + "KDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCS" 18 | + "HZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNC" 19 | + "LLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTM" 20 | + "RNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZ" 21 | + "FMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXK" 22 | + "LQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZ" 23 | + "MLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJ" 24 | + "GBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJ" 25 | + "XXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXP" 26 | + "XJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWG" 27 | + "YJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEG" 28 | + "ZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSC" 29 | + "YAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZ" 30 | + "SZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMC" 31 | + "HKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCK" 32 | + "ZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHP" 33 | + "YYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGG" 34 | + "TGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWF" 35 | + "ZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGA" 36 | + "FFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJR" 37 | + "YGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDC" 38 | + "ZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZ" 39 | + "SYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZ" 40 | + "BYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZ" 41 | + "EMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNY" 42 | + "NPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYX" 43 | + "YWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZY" 44 | + "JZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYS" 45 | + "XQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXG" 46 | + "CQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDX" 47 | + "JSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWX" 48 | + "LYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAW" 49 | + "HZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZ" 50 | + "SZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZ" 51 | + "QJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSB" 52 | + "DSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQ" 53 | + "CFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLS" 54 | + "ZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQW" 55 | + "SRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTC" 56 | + "ZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHX" 57 | + "NWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHH" 58 | + "CJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKT" 59 | + "LXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSL" 60 | + "FYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQ" 61 | + "QPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZ" 62 | + "KKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQ" 63 | + "LPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQN" 64 | + "YDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJ" 65 | + "LJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNN" 66 | + "WZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAX" 67 | + "YWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZK" 68 | + "SSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJ" 69 | + "XLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLL" 70 | + "HYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXM" 71 | + "SZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLS" 72 | + "JEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCW" 73 | + "DABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYS" 74 | + "PMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCT" 75 | + "ZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJS" 76 | + "WLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLH" 77 | + "PFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZ" 78 | + "ZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYG" 79 | + "BDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZ" 80 | + "SKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJ" 81 | + "MMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSST" 82 | + "KXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZ" 83 | + "MMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNY" 84 | + "XHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZ" 85 | + "LYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXY" 86 | + "GYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLB" 87 | + "DJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJM" 88 | + "QPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZ" 89 | + "PXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZF" 90 | + "ZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPW" 91 | + "QLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYH" 92 | + "DHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYK" 93 | + "QSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQ" 94 | + "QQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYF" 95 | + "JHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZ" 96 | + "ZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJ" 97 | + "SXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZW" 98 | + "PZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZ" 99 | + "LLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLT" 100 | + "YXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJC" 101 | + "FPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXN" 102 | + "SQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXL" 103 | + "YYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDP" 104 | + "BCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZG" 105 | + "MYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYM" 106 | + "CCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHN" 107 | + "LXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYX" 108 | + "BEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXD" 109 | + "RMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZD" 110 | + "JGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZB" 111 | + "LZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSD" 112 | + "CHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYM" 113 | + "DJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLL" 114 | + "MQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZ" 115 | + "CHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSY" 116 | + "MPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMH" 117 | + "NLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPML" 118 | + "KJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNP" 119 | + "PLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYD" 120 | + "WQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXL" 121 | + "DDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQ" 122 | + "HZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHT" 123 | + "XSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYS" 124 | + "SUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBB" 125 | + "YBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJ" 126 | + "QJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRF" 127 | + "KZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXP" 128 | + "ZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDL" 129 | + "XBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHL" 130 | + "XZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZ" 131 | + "KJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZX" 132 | + "ZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZ" 133 | + "QWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZ" 134 | + "NBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJH" 135 | + "ZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJ" 136 | + "KRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFX" 137 | + "GFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLY" 138 | + "ZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXD" 139 | + "YLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDU" 140 | + "TJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDF" 141 | + "BBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXT" 142 | + "PCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXG" 143 | + "LBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZ" 144 | + "ZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCY" 145 | + "SCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZ" 146 | + "MYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCY" 147 | + "XZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBX" 148 | + "GLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQD" 149 | + "SPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQ" 150 | + "JFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYK" 151 | + "PPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXM" 152 | + "BDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLY" 153 | + "XWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXX" 154 | + "LYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHL" 155 | + "JKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHG" 156 | + "ZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZ" 157 | + "WFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZ" 158 | + "ZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMX" 159 | + "CZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJY" 160 | + "SXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZ" 161 | + "YPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYD" 162 | + "TZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJ" 163 | + "DSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGY" 164 | + "GMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCY" 165 | + "ZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJ" 166 | + "ZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZ" 167 | + "XHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBH" 168 | + "ZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYN" 169 | + "XELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYD" 170 | + "MPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPG" 171 | + "NYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXM" 172 | + "JSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQ" 173 | + "ZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQ" 174 | + "QJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMT" 175 | + "JQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDB" 176 | + "CCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKS" 177 | + "TQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZF" 178 | + "YBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCP" 179 | + "ZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSST" 180 | + "PHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZ" 181 | + "AZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJX" 182 | + "GNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMS" 183 | + "LPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXT" 184 | + "QCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYT" 185 | + "XNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMY" 186 | + "FLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZ" 187 | + "TLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZ" 188 | + "JYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQM" 189 | + "STPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCL" 190 | + "XXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKN" 191 | + "XJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQ" 192 | + "GBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZ" 193 | + "NCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJAD" 194 | + "JLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXX" 195 | + "HCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBB" 196 | + "FJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPS" 197 | + "SYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQ" 198 | + "ZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDD" 199 | + "WRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSH" 200 | + "CKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHH" 201 | + "JTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZ" 202 | + "YENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSD" 203 | + "HRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNS" 204 | + "DJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQP" 205 | + "QJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQ" 206 | + "CZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJ" 207 | + "QQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBR" 208 | + "FERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXC" 209 | + "YZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZS" 210 | + "QYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWP" 211 | + "SLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFB" 212 | + "HBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYF" 213 | + "LZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJ" 214 | + "TJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHY" 215 | + "YXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYL" 216 | + "BLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJL" 217 | + "JXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQD" 218 | + "CYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHW" 219 | + "WKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJ" 220 | + "XY"; 221 | 222 | 223 | } 224 | } 225 | --------------------------------------------------------------------------------