【问题标题】:Passing a byte array to stream and recovering it back将字节数组传递给流并将其恢复
【发布时间】:2014-05-24 02:28:53
【问题描述】:

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

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 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符。

我该怎么办?

【问题讨论】:

  • 在调试器中查看str 并找出导致它无效的 Base64 的原因是什么?
  • 您是否尝试将第一个代码中的 base64 str 与第二个代码中的 str 进行比较?

标签: c# bytearray


【解决方案1】:

您提供的第一个代码示例进行了到 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")), "", "");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2016-06-16
    • 1970-01-01
    • 2014-01-01
    • 2014-09-22
    相关资源
    最近更新 更多