用C# socket接收数据,服务器端是java发送,客户端是c#接收,当数据量也比较大,(数据编码格式GB2312)由于返回的数据中包含汉字、数字 、字符,大部分情况下接收到的数据显示正常,但有时会出现乱码,经过观察发现,由于GB2312中一个汉字由两个字符组成,而字符、数字由一个字符组成 。 当数据过大时可能把汉字截断,只发送第一个字节过来,而第二个字节在下一批包里发送   下面是接收数据部分的主要代码private void ReceiveCallback(IAsyncResult ar) 
{
try 
{
State state = (State) ar.AsyncState;
Socket client = state.WorkSocket; // 从远程设备读取数据
int bytesRead = client.EndReceive(ar); if (bytesRead > 0) 
{
InputFeed(state.Buffer, bytesRead);
Negotiate(state.Buffer); //接收数据
                    DataAvailable(this,
                        new DataAvailableEventArgs(Encoding.GetEncoding("GB2312").GetString(state.Buffer, 0, bytesRead)));

// 继续接收剩下的数据.
client.BeginReceive(state.Buffer, 0, State.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);

else 
{
// 事件信号完成
                    if(cmdEnd)
Disconnect();
}
catch (Exception e) 
{
Disconnect();
throw new ApplicationException(e.Message);
}下面是返回的数据 基站编号    基站名称    小区号    扇区号    载频号    系统类型       管理状态    操作状态    使用状态 168         石巷        168       4         0         CDMA2000 1X    解锁        使能        激活        
 168         石巷        168       4         1         CDMA2000 1X    解锁        使能        ?せ? 请问如何判断最后一个字节是不是汉字的字节,将这个字节提取出来,将这个字节与下一批的第一个字节拼成一个完整的汉字?小弟现在没什么积分  希望各位帮帮忙

解决方案 »

  1.   

    GB2312汉字编码的第一个字节范围是0xB0-0xF7(176-247) ,所以转成字符串后,你检查最后一个字符的编码,
    如果在176-247之间就说明是半个汉字,把它截掉并补到下一批数据的头上
      

  2.   

    +1        private void check完整性(byte[] bytes)
            {
                char c = (char)bytes[bytes.Length - 1];
                if (176 <= c && c <= 247)
                {
                    Console.WriteLine("最后一个字节是汉字的一半");
                }
            }
      

  3.   

    3楼  如果包长度有上万Byte 如果按你说的  包不完整就不组包  byte数组长度能否达到上万?  
    我现在的问题是每1024byte转一次string  可能出现byte[1024]是汉字byte组成的一半 造成乱码的出现
      

  4.   

    bye[] 上万也不过10k而已,对tcp来说没问题, 改一下socket的默认缓冲区从8k改成16k就ok了。当然如果经常发送特别大的,那就定义一个自己的协议格式,包头上标明包长度就行了