.net 将字节[]追加到内存流

cetgtptt  于 2023-02-14  发布在  .NET
关注(0)|答案(3)|浏览(135)

我正在尝试读取每个文件的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();              
}

错误:
偏移量和长度超出数组的界限,或者计数大于从索引到源集合末尾的元素数

gdrx4gfi

gdrx4gfi1#

startPosition未偏移到MemoryStream,而是偏移到ba。将其更改为

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

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

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

cgh8pdjw2#

Stream.Write上的MSDN文档可能有助于澄清此问题。
流被建模为一个连续的字节序列。阅读或写入流会根据读取或写入的字节数移动您在流中的位置。
Write的第二个参数是 source 数组中开始复制字节的索引,在本例中为0,因为您希望从数组的开头读取。

68de4m5k

68de4m5k3#

也许这是一个简单的解决方案,不是最好的,但很容易

List<byte> list = new List<byte>();
 list.AddRange(Encoding.UTF8.GetBytes("aaaaaaaaaaaaa"));
 list.AddRange(Encoding.UTF8.GetBytes("bbbbbbbbbbbbbbbbbb"));
 list.AddRange(Encoding.UTF8.GetBytes("cccccccc"));

 byte[] c = list.ToArray();

相关问题