使用字节数组的一部分

时间:2009-02-26 04:22:14

标签: c# types

如果我创建了一个字节数组byte [] binBuffer = new byte [256]并且我填充了100个字节的数组,如果我只想将那100个字节传递给其他方法,是否可以做到没有创建一个100字节的新字节数组,从旧数组复制到新数组,然后传递新数组?有什么方法我可以传递前100个字节。我的应用程序特别适用于将数组传递给存储过程。

5 个答案:

答案 0 :(得分:18)

使用缓冲区时非常常见的模式是:

Foo(byte[] data, int offset, int count) {...}

图案。但是,您不能将此与SqlCommand /参数一起使用,因为当您分配参数时,它会占用整个缓冲区。您将需要一个新阵列:

byte[] second = new byte[100];
Buffer.BlockCopy(first, firstOffset, second, 0, 100);
param.Value = second;

答案 1 :(得分:2)

如果你可以使用linq:

SomeMethod(binBuffer.Take(100));

答案 2 :(得分:2)

简短的回答是:不。你做的任何事情(除了将数组本身作为参数传递)都将创建一个新数组并复制其中的前100个字节。

但是,由于您没有按值传递数组,而是传递对它的引用,如果数组是256字节或100,为什么对您来说很重要?你不是在浪费更多的记忆。您可能需要告诉方法使用多少数组,因为Length方法将返回完整长度。

编辑:我刚刚意识到你想将数组传递给存储过程。这将复制整个数组。您只需制作一份只包含您要传递的元素的副本。

答案 3 :(得分:1)

如果您使用.net 3.5,则可以使用Take()扩展方法并执行以下操作:

class Program
{
    static void Main(string[] args)
    {
        byte[] b = new byte[1000];

        dowork(b.Take(10).ToArray());

    }

    public static void dowork(byte[] b)
    {
        // do some work
    }
}

答案 4 :(得分:1)

当一个数组传递给一个方法时,实际上只传递对它的引用,因为数组实际上是引用类型。你基本上有一个指向数组的指针,然后方括号中的偏移量只是告诉你离开头有多少“槽”。因此,唯一真正的方法是将两个参数传递给您的方法。一个是实际数组,第二个是最大数,直到你需要去的地方,在你的情况下它将是100.在那个方法中,你只需遍历数组直到达到最大数。