using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace ConsoleGetPLCData.CS { /// /// 通讯编码格式提供者,为通讯服务提供编码和解码服务 /// 你可以在继承类中定制自己的编码方式如:数据加密传输等 /// public class Coder { /// /// 编码方式 /// private EncodingMothord _encodingMothord; protected Coder() { } public Coder(EncodingMothord encodingMothord) { _encodingMothord = encodingMothord; } public enum EncodingMothord { Default = 0, Unicode, UTF8, ASCII, } /// /// 通讯数据解码 /// /// 需要解码的数据 /// 编码后的数据 public virtual string GetEncodingString(byte[] dataBytes, int start, int size) { switch (_encodingMothord) { case EncodingMothord.Default: { return Encoding.Default.GetString(dataBytes, start, size); } case EncodingMothord.Unicode: { return Encoding.Unicode.GetString(dataBytes, start, size); } case EncodingMothord.UTF8: { return Encoding.UTF8.GetString(dataBytes, start, size); } case EncodingMothord.ASCII: { return Encoding.ASCII.GetString(dataBytes, start, size); } default: { throw (new Exception("未定义的编码格式")); } } } /// /// Saves the file. /// /// Name of the file. /// The result. public void SaveFile(string FileName, byte[] Result) { try { FileStream fs = new FileStream(FileName, FileMode.OpenOrCreate); fs.Write(Result, 5 + Result[1], Result[2] * 65536 + Result[3] * 256 + Result[4]); fs.Flush(); fs.Close(); } catch { } } StreamWriter writer = null; /// /// Saves the file. /// /// Name of the file. /// The result. public void WriteFile(string FileName, string Result) { try { if (writer == null) { writer = new StreamWriter(FileName); } writer.Write(string.Concat(Result.ToString(), Environment.NewLine)); writer.Flush(); } catch { } } /// /// 数据编码 /// /// 需要编码的报文 /// 编码后的数据 public virtual byte[] GetTextBytes(string datagram) { byte[] rbyte = new byte[Encoding.UTF8.GetBytes(datagram).Length + 1]; rbyte[0] = 0x55; switch (_encodingMothord) { case EncodingMothord.Default: { Encoding.Default.GetBytes(datagram, 0, datagram.Length, rbyte, 1); return rbyte; } case EncodingMothord.Unicode: { Encoding.Unicode.GetBytes(datagram, 0, datagram.Length, rbyte, 1); return rbyte; } case EncodingMothord.UTF8: { Encoding.UTF8.GetBytes(datagram, 0, datagram.Length, rbyte, 1); return rbyte; } case EncodingMothord.ASCII: { Encoding.ASCII.GetBytes(datagram, 0, datagram.Length, rbyte, 1); return rbyte; } default: { throw (new Exception("未定义的编码格式")); } } } public virtual byte[] GetFileBytes(string FilePath) { if (File.Exists(FilePath)) { string fileName = Path.GetFileName(FilePath); byte[] bytFileName = this.GetTextBytes(fileName); FileStream fs = new FileStream(FilePath, FileMode.Open); Byte[] RByte = new byte[fs.Length + 5 + bytFileName.Length]; RByte[0] = 0x66; RByte[1] = (byte)(bytFileName.Length); RByte[2] = (byte)(fs.Length / 65536); RByte[3] = (byte)(fs.Length / 256); RByte[4] = (byte)(fs.Length % 256); bytFileName.CopyTo(RByte, 5); fs.Read(RByte, 5 + bytFileName.Length, (int)fs.Length); return RByte; } else { throw (new Exception("文件不存在")); } } } }