我用socket写了一个局域网的聊天软件,用了agsXMPP这个第三方的dll文件,用agsXMPP发送的消息内容只支持字符串格式。只支持文字聊天的我已经做好了,现在我想扩充一下功能,让它支持图片,和QQ表情,类似QQ聊天那样。介于agsXMPP发送的消息内容只支持字符串,我的设想是把聊天空中的文字和图片统一序列化为字节数组,client.ClassSerializers().SerializeBinary(GetSendTextMsg()).ToArray() 这段代码的功能就是读取客户端输入框中的文字和图片信息并将其序列化为字串。我想让将序列化为字串转换为字符串格式,作为agsXMPP发送的消息内容发送出去,用户收到后,再重新转换成字节数组。请问怎样将byte[]格式转换成string  
    这个问题我几天前就在网上问了,也获得了一些答复,比如Convert.ToBase64String方法和Convert.FromBase64String方法等方法,还有其它的一些方法,我都试过了。虽然都可以实现转换,不过好像都是有损的,不能使原来的byte[]转换成string后再转换成byte[],数据保持原样。哪位高手可以推荐一个方法,可以让数据保持原样啊?

解决方案 »

  1.   

    Base64的编码格式是和Binary序列化兼容的。我用过很多次。搂主看看是不是其他地方丢包了?
      

  2.   

    如果你的收发过程没有问题,Convert.ToBase64String和Convert.FromBase64String绝对是可以互逆的。
    有损的话,还是找找你的通讯代码的问题。
      

  3.   

    聊天来回传图片?都不这么做吧? 要么,让客户端统一向一个可访问地址自行取图片, 要么客户端在本地找已安装或已下载的图片。这两种都以固定格式字符串来达到目的。比如传一个[pic:1]字符串,让客户端自行解释这个字符串。
    聊天么,即时性比较强,对反应要求比较高,一般都尽可能的少传不必要的内容。
      

  4.   

    Convert.ToBase64String方法和Convert.FromBase64String方法等方法
      

  5.   

    如果单是文本或图片这样做是没有问题的,问题在于文本中嵌入了图片,反序后还要确定图片在文本中的那个位置,我这里没有看到相关的序列代码,也不能正确判断那里有问题,你可以在本地单独的去测试一下序列和反序列的结果是否一致,来判断是否由于网络传输的造成的字节丢失的问题(我个人觉得不会),而这种序列是方式需要很好的格式数据结构,我建议你用一下.net 的RichTextBox的控件,它内置了一个很好的格式化标记语言,Save()方法可以获取这种格式化标记的字符流,这样就可以解决你的问题,如果你是用的.net 3.0以上的WCP已实现的类似的功能,用很少的代码就可以实现了(它也是用了xml格式化来实现的)
      

  6.   

    Convert.ToBase64String方法和Convert.FromBase64String方法等方法
      

  7.   

    Convert.ToBase64String方法和Convert.FromBase64String方法等方法
      

  8.   

    public static object Deserialize(string s, Type type)
        {
            XmlSerializer xs = new XmlSerializer(type);
            StringReader sr = new StringReader(s);
            object obj = xs.Deserialize(sr);
            return obj;
        }
      

  9.   

    给你个方法,你可以参考一下加密:using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Xml;
    using System.IO;
    using System.Text;public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string strCon = "Data Source=(local);Database=db_15;Uid=sa;Pwd=";
            SqlConnection sqlcon = new SqlConnection(strCon);
            string sqlstr = "select * from tb_Employee";
            SqlDataAdapter myda = new SqlDataAdapter(sqlstr, strCon);
            DataSet myds = new DataSet();
            sqlcon.Open();
            myda.Fill(myds);
            sqlcon.Close();
            myds.WriteXml("test.xml");
            XmlDocument doc = new XmlDocument();
            doc.Load("test.xml");
            Xml1.Document = doc;
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Visible = true;
            FileStream oldXml = new FileStream(test.xml",FileMode.OpenOrCreate,FileAccess.Read,FileShare.Read);
            EncodeXml("testNew.xml",oldXml);
            XmlDocument doc1 = new XmlDocument();
            doc1.Load("test.xml");
            Xml1.Document = doc1;
            XmlDocument doc2 = new XmlDocument();
            doc2.Load("testNew.xml");
            Xml2.Document = doc2;
            Button1.Enabled = false;
        }
        public void EncodeXml(string newXml, FileStream oldXml)
        {
            byte[] buffer = new byte[1024]; ;
            int readbyte = 0;
            XmlTextWriter xw = new XmlTextWriter(newXml,Encoding.UTF8);
            xw.WriteStartDocument();
            xw.WriteStartElement("root");
            BinaryReader br = new BinaryReader(oldXml);
            do
            {
                readbyte = br.Read(buffer,0,1024);
                xw.WriteBase64(buffer,0,readbyte);
            }
            while (1024 <= readbyte);
            xw.WriteEndElement();
            xw.WriteEndDocument();
            xw.Flush();
            xw.Close();
        }
    }解密:using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    using System.Xml;
    using System.IO;
    using System.Text;public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("test.xml");
            Xml1.Document = doc;
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            Label1.Visible = true;
            FileStream newXml = new FileStream("testNew.xml",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);
            decodeXml("test.xml",newXml);
            XmlDocument doc = new XmlDocument();
            doc.Load("testNew.xml");
            Xml2.Document = doc;
        }
        public void decodeXml(string oldXml, FileStream newXml)
        {
            byte[] buffer = new byte[1024]; ;
            int readbyte = 0;
            BinaryWriter bw = new BinaryWriter(newXml);
            XmlTextReader tr = new XmlTextReader(oldXml);
            tr.MoveToContent();
            do
            {
                readbyte = tr.ReadBase64(buffer, 0, 1024);
                bw.Write(buffer, 0, readbyte);
            }
            while (1024 <= readbyte);
            bw.Flush();
            bw.Close();
        }
    }
      

  10.   

    何必如此麻烦,
    如果楼主只是想实现,聊天时发送图片的话,不如用特定的数字,字符代替,
    我现在也在做聊天工具,我的构想是,每个客户端里都有很多头像的图片,就想QQ那样
    发送的时候,就发送个特定的字符串比如:“\ty”就代表个太阳的小头像,
    楼主如果想让使用者自由的用自己的图片互相发送的话,这个我的确不会有几个网页你看看吧
    http://topic.csdn.net/t/20030129/20/1400203.html
    http://so.csdn.net/bbsSearchResult.aspx?q=socket+%e4%bc%a0%e5%9b%be%e7%89%87&p=0
    有问题QQ联系吧362082536 一起学习
      

  11.   

    RichTextBox的Rtf属性(应该就是这个吧,记不清了,以R开头),这个属性就是RicheTextbox中的内容以字符串的形式显示了。你可以看看,粘贴个图片到RichTextBox中用这个属性获得的值就是一串字符串,把这串字符串赋值给另一个RichTextBox的Rtf属性则另一个RichTextBox将还原为图片,支持图文混排。试试吧。
      

  12.   

    System.text.Encoding.Default.Getstring(/*byte[]*/);// byte[]->string
    System.Text.Encoding.Default.GetBytes(/*string*/);// string->byte[]
      

  13.   

    看来问题应该出在agsXMPP这个第三方的dll文件上,它如果只能发送字符串格式的数据,那就没办法解决你的问题,因为字符串有很多是不可见的,如果有不符合规则的字符很有可能在传输中会被过滤,外加你的那个GetSendTextMsg()是否可以把图片也获取到还是个问题,我看还不如自己写那个发送过程来的直接.
      

  14.   

    LZ应该是想发自定义的图片吧,如果是表情那还不简单吗,呵呵~如14L所说
    不过现在要解决这个问题,得先知道,你为什么要用agsXMPP这个第3方的DLL?SCOKET类很好用啊,直接用就可以了,也没有什么问题,用第3方的DLL简直就是没事找事
      

  15.   

            System.Text.Encoding.Default.GetString();
    把字节转化为字符串。
      

  16.   

    Convert.ToBase64String和Convert.FromBase64String
    这样就行了
      

  17.   

    有人知道agsxmpp怎么创建永久性聊天室吗