【问题标题】:array of ByteArray into MemoryStreamByteArray 数组到 MemoryStream
【发布时间】:2010-10-24 21:32:50
【问题描述】:

我有一个返回 ByteArray 数组的方法:

public byte[][] Draw(ImageFormat imageFormat, ImageSize imageSize);

我需要把它写成MemoryStream:

var byteArray = instanceName.Draw(ImageFormat.Jpeg, ImageSize.Dpi150);
MemoryStream ms = new MemoryStream(byteArray[0]);

到目前为止,这是有效的,因为 byteArray 的数组只有一个元素。有人可以指出并提供解决方案:如果 byteArray 的数组有多个元素会发生什么?

我想用当前的代码我仍然会取 byteArray 的第一个元素并丢弃其余的,但我需要 MemoryStream 并且它不能取多维数组。

【问题讨论】:

    标签: c# asp.net multidimensional-array bytearray memorystream


    【解决方案1】:

    iYou 将不得不循环和编写,如下所示:

    var ms = new MemoryStream();
    for(var i=0; i < byteArray.Length; i++)
      ms.Write(byteArray[i], 0, byteArray[i].Length);
    

    (我不确定它是否按原样工作,您可能需要调整它,但这是原则)

    【讨论】:

    • 这可能不起作用,因为Write 字节偏移量中的第二个参数将不是第一个元素以外的元素的 0。不过答案很好。
    • 嗯,不是吗?这是开始写入的偏移量,而不是到。
    • 你是对的,它是缓冲区中开始写入的字节偏移量。所以这可能会照原样工作,不是吗?
    • 可能,但我没有测试过,所以可能有编译错误,或者类似的东西:P
    【解决方案2】:

    正如您提到的,只有 [0] 位置的第一个元素会被内存流使用。由于内存流在设计上是顺序的,因此您需要一个循环来平整数组数组并将其放入内存流中。 作为对您的代码的第二次查看,如果您在代码中的其他任何地方不需要这种类型的数据结构,我建议更改您的 Draw() 方法以生成线性数据结构而不是二维(数组数组)。

    【讨论】:

    • 我不能,这是来自第三方控件 - 我想过 :)
    • 然后围绕它写一个包装类。
    • 好的,如果第三方控件返回一个byteArray数组是什么原因呢?我们是否应该编写一个包装类来改变原始函数的返回类型?
    • 这取决于您对二维内存模型进行扁平化的频率。如果它很频繁,那么我会编写我的包装类来封装一个方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多