首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

byte[] 转换成string 时数据丢失的有关问题

2011-12-23 
byte[] 转换成string 时数据丢失的问题using Systemusing System.Collections.Genericusing System.Text

byte[] 转换成string 时数据丢失的问题
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace Operate
{
  [Serializable]
  public class Entity
  {
  public Entity()
  {
  }
  private string mid;
  private string annex;
  private string filename;

  public string Mid
  {
  get
  {
  return mid;
  }
  set
  {
  mid = value;
  }
  }
   
  public string FileName
  {
  get
  {
  return filename;
  }
  set
  {
  filename = value;
  }
  }


  public string Annex
  {
  get
  {
  return annex;
  }
  set
  {
  annex = value;
  }
  }
  }
}

上面是一个实体类



foreach (Entity obj in arrayEntity)
 {
  string strentity = obj.Mid + ";" + obj.FileName + ";" + obj.Annex;//将实体类转换成字符串用socket发送到服务器
   
  if(this.RecvMessage().StartsWith("ok"))
  {
   
  this.SendMessage(strentity); //发送到服务器的方法
 
  if (this.RecvMessage().StartsWith("InertAnnexSucessful"))
  {
  txtState.Text = "服务器成功执行附件: " + obj.FileName + "\r\n" + txtState.Text;
  executeAnnex = true;
  }
  }
}

上面循环发送实体类的字符串





  public string recvMessage()
{
  byte[] recvBytes = new byte[Int32.Parse(ss)];
  int bytes=0;
  bytes += s.Receive(recvBytes, recvBytes.Length, 0);
  byte[] gb = Encoding.Convert(utf8, gb2312, recvBytes);
  string sGb = gb2312.GetString(gb);
}


上面这个是接收消息的方法



public string sendMessage(string mes)
{
byte[] bgb = gb2312.GetBytes(mes);
 byte[] butf = Encoding.Convert(gb2312, utf8, bgb);
  client.Send(butf);
}

上面这个是发送到服务器的方法







  while (true)
  {
  string ss = this.RecvMessage();
  if (ss.StartsWith("Close"))
  {
  CloseSocketList.Add(s);
  break;
  }
  else
  {
  this.SendMessage("ok");
  byte[] recvBytes = new byte[Int32.Parse(ss)];
  int bytes=0;
  bytes += s.Receive(recvBytes, recvBytes.Length, 0);//这里可以完全接收到数据
  byte[] gb = Encoding.Convert(utf8, gb2312, recvBytes);这个转换就丢失了一些数据了,不知道怎么解决
  string sGb = gb2312.GetString(gb);
  string[] vv = sGb.Split(';');
  int i = 0;
  foreach (string ssss in vv)
  {
  if (i == 0)
  {
  entity.Mid = ssss;
  }
  if (i == 1)
  {
  entity.FileName = ssss;
  }
  if (i == 2)


  {
  entity.Annex = ssss;
  } i += 1;
  }
   
  if (this.InsertAnnex(entity.Mid, Convert.FromBase64String(entity.Annex), entity.FileName))//插入数据库的方法
  {
  txtState.Text = "成功执行客户端上传的附件:" + entity.FileName + "\r\n" + txtState.Text;
  string sendStr = "InertAnnexSucessful";
  this.SendMessage(sendStr);
  }
  }
  Thread.Sleep(3000);
  }









[解决办法]
你不要那样转换,我刚遇到了你的问题,已解决了,就是字节流转换成字符串的问题,我给你看看我的代码

客户端:
/**/
///向服务器发送信息
string sendStr = textBox3.Text;
byte[] bs = Encoding.Default.GetBytes(sendStr);//把字符串编码为字节
c.Send(bs, bs.Length, 0);//发送信息

/**/
///接受从服务器返回的信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
recvStr += Encoding.Default.GetString(recvBytes, 0, bytes);//字节流转换字符串
textBox3.Text = recvStr;//显示服务器返回信息

服务器端:
Socket temp = s.Accept();//为新建连接创建新的socket
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr = Encoding.Default.GetString(recvBytes, 0, bytes);//这里就是字节流转换字符串
MessageBox.Show(recvStr );

//给client端返回信息
string sendStr = "发送成功!";
byte[] bs = Encoding.Default.GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回信息给客户端
temp.Close();


你要注意服务器端接受和发送的数据格式,还有客户端接收和发送的数据格式
string abc=Encoding.Default.GetString(参数,参数,参数);
服务器端和客户端两边都这样接收和发送就ok!

热点排行