将字节数组传递给流并将其恢复

时间:2014-05-23 09:57:38

标签: c# bytearray

我使用以下方法将字节数组写入内存流:

string filename = "C://a.jpg";
byte[] bytes = File.ReadAllBytes(filename);
string str = Convert.ToBase64String(bytes);
adapter.PublishPhoto(Message.Create(new MemoryStream(Convert.FromBase64String(str)), new ContentType("text/plain")), "", "");

现在我正在尝试使用

恢复字节数组
var sr = new StreamReader(message.Body.Content); //message.Body.Content refers to the stream that I created.
var str = sr.ReadToEnd();
byte[] bytes = Convert.FromBase64String(str);

但它在运行时抛出此异常:输入不是有效的Base-64字符串,因为它包含非基本64字符,两个以上的填充字符或填充字符中的非法字符。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

您提供的第一个代码示例转换为base64 并返回,因此可以简化为以下内容:

string filename = "C://a.jpg";
byte[] bytes = File.ReadAllBytes(filename);
adapter.PublishPhoto(Message.Create(new MemoryStream(bytes), new ContentType("text/plain")), "", "");

也就是说,您在内存流中传递原始JPEG数据,而不是该数据的base64编码版本。您提到第二个代码示例中的message.Body.Content是包含来自第一个代码示例的所述原始JPEG数据的流。然后,您可以从中获取字节,如下所示:

using (MemoryStream targetStream = new MemoryStream())
{
    message.Body.Content.CopyTo(targetStream);
    byte[] bytes = targetStream.ToArray();
}

您可能打算在您的流中实际存储base64编码数据,在这种情况下,恢复字节的方法应该有效。为此,请按以下方式修改您的第一个样本:

adapter.PublishPhoto(Message.Create(new MemoryStream(Encoding.UTF8.GetBytes(str)), new ContentType("text/plain")), "", "");