是这样的
在发送彩信的时候,从网关发送过来的彩信有SOAP和附件,比如图片,但是图片他们采用binary方式传输,我收到消息后需要先把接收到的流全部转换成String,然后再分析处理。这样就导致采用binary的数据在我用
StreamReader read = new StreamReader(ostream);
System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
sb1.Append(read.ReadToEnd());
的时候丢了图片信息,保存图片无法打开。请问高手有没有办法在我接受到流后转换成String不丢失图片信息呢。

解决方案 »

  1.   

    彩信网关--->SOAP/binary的图片---->彩信接受---->Steam转String--->分析String,处理SOAP,保存图片。
    在这个过程中Steam转String的时候丢失了图片信息,因为图片是用binary方式传输。所以接受后转换时丢了数据。
    请问有没有办法这里不丢数据呢?
      

  2.   

    StreamReader read = new StreamReader(ostream);是读取文本。
    图片不是文本数据,当然不行。
    用FileStream试试
      

  3.   

    是不是应该Stream到byte数组呀,帮你顶。
      

  4.   

    /// <summary>
            /// 保存图像
            /// </summary>
            private void SaveImage()
            {
                Cursor.Current = Cursors.WaitCursor ;
                try
                {
                    if (this.pictureBox1.Image == null)
                        return;
                    string imageExtension = GetExtenstion(this.pictureBox1.Image);
                    SaveFileDialog saveImageDialog = new SaveFileDialog();
                    saveImageDialog.Filter = SaveFilterType + "(*." + imageExtension + ")|*." + imageExtension;
                    saveImageDialog.RestoreDirectory = false;
                    saveImageDialog.OverwritePrompt = true;
                    saveImageDialog.CheckPathExists = true;
                    saveImageDialog.AddExtension = true;
                    saveImageDialog.CreatePrompt = true;
                    if (imageExtension == "" || imageExtension == null)
                    {
                        imageExtension = "jpg";
                    }
                    if (SaveImageName == null || SaveImageName == "")
                    {
                        DateTime dt = DateTime.Now;
                        SaveImageName = dt.Year + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Second.ToString() + "." + imageExtension;
                    }
                    else
                    {
                        FileInfo fi = new FileInfo(SaveImageName);
                        SaveImageName = fi.Name.Substring(0, fi.Name.LastIndexOf('.')) + "." + imageExtension;
                        fi = null;
                    }
                    saveImageDialog.FileName = SaveImageName;
                    saveImageDialog.FilterIndex = 1;                DialogResult dr = saveImageDialog.ShowDialog();
                    if (dr == DialogResult.Cancel)
                        return;                SaveImageName = saveImageDialog.FileName;
                    this.pictureBox1.Image.Save(saveImageDialog.FileName);
                    //保存最近一次保存目录
                    saveImageDialog = null;            }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message);
                }
                finally
                {
                    Cursor.Current = Cursors.Default;
                }
            }
            /// <summary>
            /// 获取图像格式
            /// </summary>
            /// <returns>图像格式</returns>
            private string GetExtenstion(Image img)
            {
                Type type = typeof(ImageFormat);
                PropertyInfo[] imageFormatList=type.GetProperties (BindingFlags .Static |BindingFlags .Public);
                for (int i=0;i<imageFormatList .Length ;i++)
                {
                    ImageFormat format=(ImageFormat)imageFormatList [i].GetValue (null,null);
                    if(format .Guid .Equals (img.RawFormat .Guid ))
                    {
                        return imageFormatList [i].Name ;
                    }
                }
                return "";
            }
      

  5.   

    但是解析彩信包的类要求是传入一个string啊。用字节数组处理更难处理。
      

  6.   

    是Stream->String就可以了,但是在Stream至String的时候丢数据了。
      

  7.   

    你不会保存一个二进制数组做副本  再传入另一个string进去么..
      

  8.   

    用byte[]=new byte[ostream.Length] 接收你得来的二进制数据流试试
      

  9.   

    接受是正常的,问题是在接受到的Stream转换成String的时候出了问题。
      

  10.   

    不知道网络传输binary是用什么字符集。我试过了ASCII,Default都不行,郁闷。
      

  11.   

    我想问你保存图片是怎么保存的啊,难不成把一个String的内容保存成图像去了?
    你应该有方法指导这个流的什么位置到什么位置是binary的图像数据吧,如果知道的话把这部分byte[]单取出来保存图象就可以了啊
      

  12.   

    网络传输binary不存在字符集之说,字符集是对文字信息而言的,binary数据就是用来传输那种没有特定格式的数据,从这个byte[]数组是可以直接还原出一个Image对象的
      

  13.   

    已经基本上解决问题。目前采用的模式是
    一个流转换成字节数组的副本。一个用StreamRead读取文本,非特殊部分用直接用ReadLine,特殊部分转换成数字分割。
    保存成字符串如下:
    MIME-Version: 1.0
    Content-Type: multipart/related; type="text/xml"; start="<[email protected]>"; boundary="----=_Part_64_15298594.1278663723367"------=_Part_64_15298594.1278663723367
    Content-Type: text/xml; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    Content-ID: <[email protected]><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:loc="http://www.chinatelecom.com.cn/schema/ctcc/multimedia_messaging/send/v2_2/local">
    </soapenv:Envelope>
    ------=_Part_64_15298594.1278663723367
    Content-Type: image/jpeg
    Content-Transfer-Encoding: binary
    Content-ID: <h1.jpg>
    255,216,255,224,0,16,74,70,73,70,0,1,1,1,0,72,0,72,0,0,255,219,0,67,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,255,219,0,67,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,255,192,0,17,8,0,90,1,244,3,1,17,0,2,17,1,3,17,1,255,196,0,30,0,1,1,0,2,2,3,1,1,0,0,0,0,0,0,0,0,0,1,8,9,2,7,4,5,6,3,10,255,196,0,85,16,0,0,5,2,1,8,5,8,6,6,6,7,7,5,0,0,1,2,3,4,5,0,6,7,8,17,18,21,23,83,84,146,19,20,22,33,162,34,49,82,145,150,209,213,225,9,65,81,97,98,210,35,113,129,130,161,226,36,37,50,66,114,240,51,54,85,163,177,193,211,38,52,53,67,134,181,197,68,99,115,178,194,255,196,0,30,1,1,0,2,1,5,1,1,0,0,0,0,0,0,0,0,0,0,1,2,8,3,4,5,6,7,9,10,255,196,0,76,17,0,0,5,1,3,7,6,13,4,2,0,4,3,9,0,0,0,1,2,3,4,5,6,17,18,7,19,21,22,33,81,82,20,49,98,146,161,240,8,34,65,83,97,113,145,149,162,210,212,225,226,50,129,177,209,35,66,9,51,67,114,36,53,178,37,99,118,130,147,182,193,241
    ------=_Part_64_15298594.1278663723367--jpg部分只是取了一部分数据,太多了,没办法发。