Подтвердить что ты не робот

Использование части массива байтов

Если у меня есть массив байтов, созданный byte [] binBuffer = новый байт [256], и я заполняю 100 байтов массива, если я хочу передать только эти 100 байт другому методу, можно ли это сделать что без создания нового байтового массива в 100 байт, копирование из старого массива в новое, а затем передача нового массива? Как-то я могу просто передать первые 100 байт. Мое приложение специально применяется для передачи массива в хранимую процедуру.

4b9b3361

Ответ 1

При работе с буферами очень распространенным является:

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

шаблон. Однако вы не можете использовать это с параметром SqlCommand/, поскольку, когда вы назначаете параметр, он потребляет весь буфер. Вам понадобится новый массив:

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

Ответ 2

Если вы можете использовать linq:

SomeMethod(binBuffer.Take(100));

Ответ 3

Короткий ответ: НЕТ. Все, что вы делаете (помимо передачи самого массива в качестве параметра), создаст новый массив и скопирует первые 100 байтов.

Однако, поскольку вы не передаете массив по значению, а вместо этого передаете ссылку на него, почему это имеет значение для вас, если массив равен 256 байтам или 100? Вы не теряете больше памяти. Возможно, вам нужно будет указать метод, сколько из этого массива использовать, хотя метод Length вернет всю длину.

EDIT: Я просто понял, что вы хотите передать массив в хранимую процедуру. Это скопирует весь массив. Вам нужно будет сделать копию только с теми элементами, которые вы хотите передать.

Ответ 4

если вы используете .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
    }
}

Ответ 5

Когда массив передается методу, фактически передается только ссылка на него, поскольку массивы являются фактически ссылочными типами. У вас в основном есть указатель на массив, а затем смещение в квадратных скобках просто говорит вам, сколько "слотов" от начала. Поэтому единственный реальный способ сделать это - передать два параметра вашему методу. Один из них является фактическим массивом, а второй является максимальным числом до тех пор, пока вам не нужно идти, в вашем случае это будет 100. В этом методе вы затем проецируете только массив до достижения максимального числа.