socket传输汉字截断为乱码问题

publicxiao 2010-11-19 10:31:36
用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 解锁 使能 ?せ?

请问如何判断最后一个字节是不是汉字的字节,将这个字节提取出来,将这个字节与下一批的第一个字节拼成一个完整的汉字?小弟现在没什么积分 希望各位帮帮忙
...全文
577 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
publicxiao 2010-11-20
  • 打赏
  • 举报
回复
3楼 如果包长度有上万Byte 如果按你说的 包不完整就不组包 byte数组长度能否达到上万?
我现在的问题是每1024byte转一次string 可能出现byte[1024]是汉字byte组成的一半 造成乱码的出现
烈火蜓蜻 2010-11-20
  • 打赏
  • 举报
回复
很明显,楼主不明白什么是通讯协议

包完不完整,根据通讯协议就可以判断出来,如果包完整了,再进行组包,不完整就不要组包
jincaomao 2010-11-20
  • 打赏
  • 举报
回复
bye[] 上万也不过10k而已,对tcp来说没问题, 改一下socket的默认缓冲区从8k改成16k就ok了。

当然如果经常发送特别大的,那就定义一个自己的协议格式,包头上标明包长度就行了
colorall 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jshi123 的回复:]
GB2312汉字编码的第一个字节范围是0xB0-0xF7(176-247) ,所以转成字符串后,你检查最后一个字符的编码,
如果在176-247之间就说明是半个汉字,把它截掉并补到下一批数据的头上
[/Quote]+1

private void check完整性(byte[] bytes)
{
char c = (char)bytes[bytes.Length - 1];
if (176 <= c && c <= 247)
{
Console.WriteLine("最后一个字节是汉字的一半");
}
}
jshi123 2010-11-19
  • 打赏
  • 举报
回复
GB2312汉字编码的第一个字节范围是0xB0-0xF7(176-247) ,所以转成字符串后,你检查最后一个字符的编码,
如果在176-247之间就说明是半个汉字,把它截掉并补到下一批数据的头上

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧