c#的字符解析簡單示例

一直從事c++方面的開發,進來需要使用c#做項目,項目中需要解析一段網絡流,從中將圖片提取出來,網絡協議很簡單,採用

<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>();

    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章