读取图片成二进制文件,然后保存数据变了

PaulLeder 2010-07-08 04:02:34
是这样的
在发送彩信的时候,从网关发送过来的彩信有SOAP和附件,比如图片,但是图片他们采用binary方式传输,我收到消息后需要先把接收到的流全部转换成String,然后再分析处理。这样就导致采用binary的数据在我用
StreamReader read = new StreamReader(ostream);
System.Text.StringBuilder sb1 = new System.Text.StringBuilder();
sb1.Append(read.ReadToEnd());
的时候丢了图片信息,保存图片无法打开。请问高手有没有办法在我接受到流后转换成String不丢失图片信息呢。
...全文
248 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
PaulLeder 2010-07-09
  • 打赏
  • 举报
回复
已经基本上解决问题。目前采用的模式是
一个流转换成字节数组的副本。一个用StreamRead读取文本,非特殊部分用直接用ReadLine,特殊部分转换成数字分割。
保存成字符串如下:
MIME-Version: 1.0
Content-Type: multipart/related; type="text/xml"; start="<rootpart@soapui.org>"; boundary="----=_Part_64_15298594.1278663723367"

------=_Part_64_15298594.1278663723367
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-ID: <rootpart@soapui.org>

<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部分只是取了一部分数据,太多了,没办法发。
ziliz854 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 paulleder 的回复:]
不知道网络传输binary是用什么字符集。我试过了ASCII,Default都不行,郁闷。
[/Quote]
网络传输binary不存在字符集之说,字符集是对文字信息而言的,binary数据就是用来传输那种没有特定格式的数据,从这个byte[]数组是可以直接还原出一个Image对象的
ziliz854 2010-07-09
  • 打赏
  • 举报
回复
我想问你保存图片是怎么保存的啊,难不成把一个String的内容保存成图像去了?
你应该有方法指导这个流的什么位置到什么位置是binary的图像数据吧,如果知道的话把这部分byte[]单取出来保存图象就可以了啊
PaulLeder 2010-07-08
  • 打赏
  • 举报
回复
不知道网络传输binary是用什么字符集。我试过了ASCII,Default都不行,郁闷。
PaulLeder 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 haohongzhou 的回复:]

用byte[]=new byte[ostream.Length] 接收你得来的二进制数据流试试
[/Quote]
接受是正常的,问题是在接受到的Stream转换成String的时候出了问题。
PaulLeder 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 red_angelx 的回复:]

你不会保存一个二进制数组做副本 再传入另一个string进去么..
[/Quote]
这样有啥用途?
haohongzhou 2010-07-08
  • 打赏
  • 举报
回复
用byte[]=new byte[ostream.Length] 接收你得来的二进制数据流试试
Red_angelX 2010-07-08
  • 打赏
  • 举报
回复
你不会保存一个二进制数组做副本 再传入另一个string进去么..
PaulLeder 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 blogtjf 的回复:]

/// <summary>
/// 保存图像
/// </summary>
private void SaveImage()
{
Cursor.Current = Cursors.WaitCursor ;
try
{
……
[/Quote]
谢谢你 回答,但是你的回答并不是我问题所问的。
PaulLeder 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 swimmingfish2004 的回复:]

是不是应该Stream到byte数组呀,帮你顶。
[/Quote]
是Stream->String就可以了,但是在Stream至String的时候丢数据了。
PaulLeder 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zxp8819 的回复:]

其实你可以选择不用String的
[/Quote]
但是解析彩信包的类要求是传入一个string啊。用字节数组处理更难处理。
宇峰科技 2010-07-08
  • 打赏
  • 举报
回复
/// <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 "";
}
宇峰科技 2010-07-08
  • 打赏
  • 举报
回复
你要注意保存图片的格式
fmnana 2010-07-08
  • 打赏
  • 举报
回复
ding yi xia
skyland84 2010-07-08
  • 打赏
  • 举报
回复
彩信网关是怎么转换的?
swimmingfish2004 2010-07-08
  • 打赏
  • 举报
回复
是不是应该Stream到byte数组呀,帮你顶。
铛铛 2010-07-08
  • 打赏
  • 举报
回复
其实你可以选择不用String的
sisen 2010-07-08
  • 打赏
  • 举报
回复
StreamReader read = new StreamReader(ostream);是读取文本。
图片不是文本数据,当然不行。
用FileStream试试
PaulLeder 2010-07-08
  • 打赏
  • 举报
回复
彩信网关--->SOAP/binary的图片---->彩信接受---->Steam转String--->分析String,处理SOAP,保存图片。
在这个过程中Steam转String的时候丢失了图片信息,因为图片是用binary方式传输。所以接受后转换时丢了数据。
请问有没有办法这里不丢数据呢?

110,566

社区成员

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

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

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