c#的字符解析简单示例
2013-10-25 14:35
288 查看
一直从事c++方面的开发,进来需要使用c#做项目,项目中需要解析一段网络流,从中将图片提取出来,网络协议很简单,采用
<image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}><image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}>.......传输,
写了个简单类,吧jpeg数据提取处理,直接上代码
<image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}><image,图片ID,通道1,通道2,通道3,通道4,数据长度,{jpeg数据}>.......传输,
写了个简单类,吧jpeg数据提取处理,直接上代码
public delegate void onImageDataHandle(int id1, int id2, int id3, int id4, byte[] buffer); public class ImageRecive { static public void onImageDataDefault(int id1, int id2, int id3, int id4, byte[] buffer) { return; } public onImageDataHandle onImageHandle = onImageDataDefault; public ImageRecive(string addr,int port) { _addr = addr; _port = port; } public void addPictrueBox(int iKey, ref System.Windows.Forms.PictureBox pictrueBox) { _mapPictrueBox.Add(iKey, pictrueBox); } public void Start() { _thread = new Thread(new ThreadStart(this.doWork)); _thread.IsBackground = true; _thread.Start(); } public void Stop() { _thread.Abort(); _thread.Join(); } private string readStr2Int(ref MemoryStream ms) { byte[] buffer = new byte[10]; int j = 0; for (int i = 0; i < 10;i++ ) { byte be = (byte)ms.ReadByte(); if (be.CompareTo((byte)' ') == 0) { continue; } if (be.CompareTo((byte)',') != 0) { buffer[j++] = be; } else { break; } } string str = System.Text.Encoding.ASCII.GetString(buffer); str.Trim('\0'); return str; } private void readMemBuffer(ref MemoryStream ms, byte[] buffer, int iSize) { for (int i = 0; i < iSize;i++ ) { ms.Read(buffer, i, 1); } return; } private void receiveToBuffer(ref Socket s, byte[] buffer, int iSize) { int offset = 0; while (offset < iSize) { int len = s.Receive(buffer, offset, iSize - offset, SocketFlags.None); offset += len; } return; } private void doWork() { Socket sockClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { int debug_index = 0; sockClient.ReceiveBufferSize = 0x0FFFFFFF; sockClient.Connect(_addr, _port); MemoryStream msStream = new MemoryStream(); int bufferSize = 100; byte[] buffer = new byte[bufferSize]; int cID1 = 0, cID2 = 0, cID3 = 0, cID4 = 0; byte[] imageStr = new byte[6]; while (!_bStop) { if (msStream.Length - msStream.Position < 6) { //int len = sockClient.Receive(buffer); receiveToBuffer(ref sockClient, buffer, bufferSize); Int64 pos = msStream.Position; msStream.Seek(0, SeekOrigin.End); msStream.Write(buffer, 0, bufferSize); msStream.Seek(pos, SeekOrigin.Begin); } long rLen = msStream.Read(imageStr, 0, 6); if (imageStr[0].CompareTo((byte)'<') == 0 && imageStr[1].CompareTo((byte)'i') == 0 && imageStr[2].CompareTo((byte)'m') == 0 && imageStr[3].CompareTo((byte)'a') == 0 && imageStr[4].CompareTo((byte)'g') == 0 && imageStr[5].CompareTo((byte)'e') == 0) { if (msStream.Length - msStream.Position < 50) { //int len = sockClient.Receive(buffer); receiveToBuffer(ref sockClient, buffer, bufferSize); Int64 pos = msStream.Position; msStream.Seek(0, SeekOrigin.End); msStream.Write(buffer, 0, bufferSize); msStream.Seek(pos, SeekOrigin.Begin); } //image id msStream.ReadByte(); msStream.ReadByte(); int iImageID = Int32.Parse(readStr2Int(ref msStream)); cID1 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier); cID2 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier); cID3 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier); cID4 = Int32.Parse(readStr2Int(ref msStream), System.Globalization.NumberStyles.AllowHexSpecifier); int iImageSize = Int32.Parse(readStr2Int(ref msStream)); // msStream.ReadByte(); msStream.ReadByte(); Int64 imagePosStart = msStream.Position; //怀疑图像长度可能不准确时,可以通过jpeg图片结束标记0xFF 0xD9 判断图像结束 //while (true) //{ // if (msStream.Length-msStream.Position < 10) // { // receiveToBuffer(ref sockClient, buffer, bufferSize); // Int64 pos = msStream.Position; // msStream.Seek(0, SeekOrigin.End); // msStream.Write(buffer, 0, bufferSize); // msStream.Seek(pos, SeekOrigin.Begin); // } // byte[] endBuffer = new byte[3]; // readMemBuffer(ref msStream, endBuffer, 3); // //if (msStream.Position == 0x99C0) // //{ // // int debug = 0; // //} // if (endBuffer[0].CompareTo((byte)0xFF) == 0 && // endBuffer[1].CompareTo((byte)0xD9) == 0 && // endBuffer[2].CompareTo((byte)0x7D) == 0) //0x7D 不是jpg结束标记,是‘}’ // { // Int64 iImageEndPos = msStream.Position; // int imageRealSize = (int)(iImageEndPos - imagePosStart-1); // msStream.Seek(imagePosStart, SeekOrigin.Begin); // byte[] imageBuff = new byte[imageRealSize]; // readMemBuffer(ref msStream, imageBuff, imageRealSize); // if (onImageHandle != null) // { // onImageHandle(cID1, cID2, cID3, cID4, imageBuff); // } // int remain = (int)(msStream.Length - msStream.Position); // byte[] remainBuffer = new byte[remain]; // readMemBuffer(ref msStream, remainBuffer, remain); // msStream.SetLength(0); // msStream.Write(remainBuffer, 0, remain); // msStream.Seek(0, SeekOrigin.Begin); // break; // } // else // { // msStream.Seek(-2, SeekOrigin.Current); // } //} if (msStream.Length - msStream.Position < iImageSize) { int remain = iImageSize - (int)(msStream.Length - msStream.Position); byte[] remainBuff = new byte[remain]; // int len = sockClient.Receive(remainBuff); receiveToBuffer(ref sockClient, remainBuff, remain); Int64 pos = msStream.Position; msStream.Seek(0, SeekOrigin.End); msStream.Write(remainBuff, 0, remain); msStream.Seek(pos, SeekOrigin.Begin); //msStream. byte[] imageBuff = new byte[iImageSize]; readMemBuffer(ref msStream, imageBuff, iImageSize); if (onImageHandle != null) { onImageHandle(cID1, cID2, cID3, cID4, imageBuff); //Thread.Sleep(2000); System.Diagnostics.Trace.WriteLine((debug_index++).ToString()); } msStream.SetLength(0); msStream.Seek(0, SeekOrigin.Begin); // MemoryStream msImage = new MemoryStream(imageBuff); // System.Drawing.Image image1 = System.Drawing.Image.FromStream(msImage); // image1.Save("d:\\1.jpg"); } } else { msStream.Seek(-5, SeekOrigin.Current); } } } catch (System.Exception ex) { System.Diagnostics.Trace.WriteLine("thread exit except"); sockClient.Close(); return; } System.Diagnostics.Trace.WriteLine("thread exit nomal"); return; } private Thread _thread; private string _addr; private int _port; private bool _bStop = false; private Dictionary<int, PictureBox> _mapPictrueBox = new Dictionary<int, PictureBox>(); }
相关文章推荐
- 编程资料:C#简单解析Json数据示例附开源json解析类
- c#委托的异步调用 简单示例
- [转]C#webservice的简单示例
- linux简单字符驱动示例
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- Python random模块用法解析及简单示例
- C# 带参数线程的一个简单示例
- C# TCPClient简单示例
- Asp.Net(C#)利用XPath解析XML文档示例
- C#实现的简单整数四则运算计算器功能示例
- 在c#多线程使用IOCP(完成端口)的简单示例
- C#.NET解析XML(简单实例)
- Asp.Net判断一个字符串是否包含某个字符的最简单方法!(示例)
- 简单C#事件示例
- C# 数据库写入简单示例
- Skinned Mesh 原理解析和一个最简单的实现示例
- 蛙蛙推荐:在c#使用IOCP(完成端口)的简单示例
- C#使用互斥量(Mutex)实现多进程并发操作时多进程间线程同步操作(进程同步)的简单示例代码及使用方法
- xmlHTTP xmlDOC 与 C#中DataSet的结合 实现AJAX简单示例
- 用C#读SQL SERVER到控制台的简单示例