c# – 高效拆分流中的分隔符分隔的消息
我想要一种基于分隔符分割传入数据流的内存高效且省时的方法.流是网络流,进入的“消息”由CRLF分割.以前我已经通过使用UTF8将incomming数据转换为字符串,然后检查CRLF,如果它存在我基于此分割,但是,这不是解决问题的一种非常好的方法,因为越来越多的消息是传入.此外,我可能会得到包含1条消息的数据块,并且我可能会获得包含10条消息的datachunks,甚至包含仅包含部分消息的消息.
所以这就是我到目前为止所想到的.将内存流用于缓冲区,当数据进入时将数据读入内存流.如果我找到了分隔符(CRLF),我会获取内存流中的所有数据,然后调用messageReceived,然后继续.有什么想法吗? [编辑] 解决方法
我认为你确实有正确的想法.只需使用字节数组即可.
这是我如何做到的,纯粹未经测试,可以优化…. byte[] m_LongBuffer; byte[] m_SmallBuffer; void ReceiveCallback(IAsyncResult iar) { //m_SmallBuffer contains the data read from the stream //Append it to m_LongBuffer int bytesread = socket.EndReceive(iar); m_LongBuffer = m_LongBuffer.Concat(m_SmallBuffer.Take(bytesread)).ToArray(); int startpoint = 0; int splitpoint = 0; int lastendpoint = 0; bool twochar = false; do { for(int i=0;i<m_LongBuffer.Length;++i) { if((m_LongBuffer[i] == 0x0A) || (m_LongBuffer[i] == 0x0D)) { splitpoint = i; if((m_LongBuffer[i+1] == 0x0A) || (m_LongBuffer[i+1] == 0x0D)) twochar=true; else twochar=false; lastendpoint = splitpoint; String message = ASCII.ASCIIEncoding.GetString(m_LongBuffer.Skip(startpoint).Take(splitpoint - startpoint).ToArray()); //Do something with the message startpoint = splitpoint + (twochar ? 2 : 1); break; } } if(i >= m_LongBuffer.Length) splitpoint = -1; } while (splitpoint != -1); m_LongBuffer = m_LongBuffer.Skip(lastendpoint).ToArray(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |