UTF-8
UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)。
使用UTF-8的好处是现在一些手机平台都是使用UTF-8,另外在一些嵌入式平台,如果不支持中文,只支持英文,可以不转换,UTF-8就可以识别。
NET默认支持的编码是Unicode,为了支持UTF-8,需要转换下,为了编程简便性,我们只在发包和解包的地方进行UTF-8转换。
收包把UTF-8转为UNICODE
收包我们需要在分包完成后,把内存数组是UTF-8编码转换为Unicode,即为C#的string,后续的处理就都可以基于string进行处理,比较方便。
- public virtual bool ProcessPacket(byte[] buffer, int offset, int count) //处理分完包后的数据,把命令和数据分开,并对命令进行解析
- {
- if (count < sizeof(int))
- return false;
- int commandLen = BitConverter.ToInt32(buffer, offset); //取出命令长度
- <span style="color:#ff6666;">string tmpStr = Encoding.UTF8.GetString(buffer, offset + sizeof(int), commandLen);</span>
- if (!m_incomingDataParser.DecodeProtocolText(tmpStr)) //解析命令
- return false;
- return ProcessCommand(buffer, offset + sizeof(int) + commandLen, count - sizeof(int) - commandLen); //处理命令
- }
扫描二维码关注公众号,回复: 194907 查看本文章
发包把UNICODE转为UTF-8
发包我们主要调用DoSendResult,从发送缓冲中获取协议文本后,转换为UTF-8,然后写入发送列表中。
- public bool DoSendResult()
- {
- string commandText = m_outgoingDataAssembler.GetProtocolText();
- <span style="color:#ff6666;">byte[] bufferUTF8 = Encoding.UTF8.GetBytes(commandText);</span>
- int totalLength = sizeof(int) + bufferUTF8.Length; //获取总大小
- AsyncSendBufferManager asyncSendBufferManager = m_asyncSocketUserToken.SendBuffer;
- asyncSendBufferManager.StartPacket();
- asyncSendBufferManager.DynamicBufferManager.WriteInt(totalLength, false); //写入总大小
- asyncSendBufferManager.DynamicBufferManager.WriteInt(bufferUTF8.Length, false); //写入命令大小
- asyncSendBufferManager.DynamicBufferManager.WriteBuffer(bufferUTF8); //写入命令内容
- asyncSendBufferManager.EndPacket();
- bool result = true;
- if (!m_sendAsync)
- {
- int packetOffset = 0;
- int packetCount = 0;
- if (asyncSendBufferManager.GetFirstPacket(ref packetOffset, ref packetCount))
- {
- m_sendAsync = true;
- result = m_asyncSocketServer.SendAsyncEvent(m_asyncSocketUserToken.ConnectSocket, m_asyncSocketUserToken.SendEventArgs,
- asyncSendBufferManager.DynamicBufferManager.Buffer, packetOffset, packetCount);
- }
- }
- return result;
- }
DEMO下载地址: http://download.csdn.net/detail/sqldebug_fan/7467745
免责声明:此代码只是为了演示C#完成端口编程,仅用于学习和研究,切勿用于商业用途。水平有限,C#也属于初学,错误在所难免,欢迎指正和指导。邮箱地址:[email protected]。