【问题标题】:Append byte[] to MemoryStream将 byte[] 附加到 MemoryStream
【发布时间】:2014-03-03 14:16:07
【问题描述】:

我正在尝试读取每个文件的 byte[] 并将其添加到 MemoryStream。下面是引发错误的代码。我在附加中缺少什么?

byte[] ba = null;
List<string> fileNames = new List<string>();
int startPosition = 0;
using (MemoryStream allFrameStream = new MemoryStream())
{
    foreach (string jpegFileName in fileNames)
    {
        ba = GetFileAsPDF(jpegFileName);

        allFrameStream.Write(ba, startPosition, ba.Length); //Error here
        startPosition = ba.Length - 1;
    }

    allFrameStream.Position = 0;

    ba = allFrameStream.GetBuffer();

    Response.ClearContent();
    Response.AppendHeader("content-length", ba.Length.ToString());
    Response.ContentType = "application/pdf";
    Response.BinaryWrite(ba);
    Response.End();
    Response.Close();              
}

错误:

偏移量和长度超出数组的范围或计数更大 比从索引到源末尾的元素数 收藏

【问题讨论】:

    标签: c# asp.net .net c#-4.0


    【解决方案1】:

    startPosition 不偏移到 MemoryStream,而是偏移到 ba。改成

    allFrameStream.Write(ba, 0, ba.Length); 
    

    所有字节数组都将附加到allFrameStream

    顺便说一句:不要使用ba = allFrameStream.GetBuffer();,而是使用ba = allFrameStream.ToArray();(您实际上不需要 MemoryStream 的内部缓冲区)。

    【讨论】:

    • 这是一个循环。它会永远覆盖字节[]吗?因为你的偏移量是 0
    • @Billa 它会在每次写入时追加,除非您手动更改位置。该偏移量表示 将 ba 写入从 ba 的偏移量 0 到 len 的内存流
    • 但是当有两个图像可用时,我只得到生成的 pdf 文档中的最后一个图像。第一张图片不见了:(
    • @Billa 您的代码现在在您所询问的上下文中是正确的。但是将字节数组附加到内存流并期望图像列表不是正确的假设。超出你的问题范围。也许你需要List&lt;byte[]&gt;
    • 是的,这可能是正确的。只需将列表中的每个字节 [] 推入并将所有字节合并到内存流中。
    【解决方案2】:

    Stream.Write 上的 MSDN 文档可能有助于澄清问题。

    流被建模为连续的序列字节。读取或写入流会根据读取或写入的字节数移动您在流中的位置。

    Write 的第二个参数是 source 数组中开始复制字节的索引。在您的情况下,这是 0,因为您想从数组的开头读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2015-11-29
      相关资源
      最近更新 更多