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();
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
