расщепленный массив [] - PullRequest
       17

расщепленный массив []

1 голос
/ 05 августа 2009
private Arraylist split(byte[] filebytes, int range)
{
}

как разделить этот файл байтов по заданному диапазону, т.е. если диапазон равен 100 следует разделить файловые байты на 100 КБ и поместить их в массив данных до eof. у меня есть .net Framework 1.1 только ... заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 05 августа 2009

Если я правильно понял вопрос, вы хотите разделить существующий массив на массивы (максимум) 100k элементов и поместить эти массивы в список массивов?

ArrayList Split(byte[] filebytes, int range)
{
    range *= 1000;
    int pos = 0;
    int remaining;

    ArrayList result = new ArrayList();

    while ((remaining = filebytes.Length - pos) > 0)
    {
        byte[] block = new byte[Math.Min(remaining, range)];

        Array.Copy(filebytes, pos, block, 0, block.Length);
        result.Add(block);

        pos += block.Length;
    }

    return result;
}

Измените 1000 на 1024, если это было вашим намерением:)

Я не могу придумать причину, почему вы хотели бы сделать что-то подобное, хотя. Загрузка одного огромного массива байтов и , а затем разбиение на блоки довольно неэффективно, если бы вы могли разбить их на блоки по 100 Кб, читая ваши данные.


Что касается вашего комментария: отправка всего файла в сокет должна быть намного проще, чем вы это делаете. У меня нет способа тестирования, но это должно работать в .NET 1.1.

private void SendFileToSocket(string fileName)
{
    Socket socket = new Socket(
        AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    using (socket)
    {
        socket.Connect("server.domain.com", 12345);

        using (NetworkStream networkStream = new NetworkStream(socket))
        using (FileStream fileStream = File.OpenRead(fileName))
        {
            byte[] buffer = new byte[32768];

            while (true)
            {
                int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
                if (bytesRead == 0)
                    break;

                networkStream.Write(buffer, 0, bytesRead);
            }
        }
    }
}

Размер буфера немного произвольный, но он должен быть достаточно большим.

0 голосов
/ 05 августа 2009

Идея, предложенная Thorarin , является хорошим решением. Однако я бы внес небольшое изменение в отношении объявления блока byte []. Лучше разместить объявление за пределами . Насколько я знаю, это лучше для вашей работы. Вы не заметите ничего особенного (особенно в небольших версиях массива filebytes), но программное обеспечение, такое как FXCop, предупредит вас о объявлениях в конструкциях while / for (по крайней мере, насколько я знаю). Таким образом, код будет выглядеть так:

ArrayList Split(byte[] filebytes, int range)
{
    range *= 1000;
    int pos = 0;
    int remaining;

    ArrayList result = new ArrayList();

    //Placed the declaration of block outside the while. 
    byte[] block = null; 
    while ((remaining = filebytes.Length - pos) > 0)
    {
        block = new byte[Math.Min(remaining, range)];

        Array.Copy(filebytes, pos, block, 0, block.Length);
        result.Add(block);

        pos += block.Length;
    }

    return result;
}

Для более подробной информации смотрите: Объявление переменной внутри или вне цикла?@Social.MSDN

0 голосов
/ 05 августа 2009

Итак, если я правильно понимаю, вы хотите и ArrayList размером byte[] размера 100000? Я не могу написать код для вас (здесь нет VS), но самый эффективный способ - создать новые объекты массива и использовать Array.Copy() для копирования данных из вашего большого массива в кучу меньших массивы.

...