split byte []数组

时间:2009-08-05 05:42:48

标签: c# .net .net-1.1

private Arraylist split(byte[] filebytes, int range)
{
}

如何按给定范围拆分此文件字节,即范围是100 应该将文件字节分开100kb并将其放入arraylist直到eof。 我只有.net框架1.1 ...提前感谢。

3 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,你想将现有数组切割成(最多)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:)

我无法想到你为什么要做这样的事情的原因。如果你可以在读取数据时将它们分成100k块,那么加载一个巨大的字节数组并将然后拆分成块是相当低效的。


关于你的评论:将整个文件发送到套接字应该比你做到的要简单得多。我无法测试,但这应该适用于.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);
            }
        }
    }
}

缓冲区大小有点随意,但它应该足够大。

答案 1 :(得分:0)

因此,如果我理解正确,您希望ArrayList byte[]的大小为100000?我不能为你编写代码(目前没有VS),但最有效的方法是创建新的数组对象并使用Array.Copy()将数据从大数组复制到一堆较小的数组。

答案 2 :(得分:-1)

Thorarin提出的想法是一个很好的解决方案。但是我会对byte []块的声明做一个小改动。最好将声明放在之外。据我所知,这对你的表现更好。你不会注意到很多(尤其是文件字节数组的小版本),但像FXCop这样的软件会警告你在while / for constructions中的声明(至少据我所知)。所以代码看起来像这样:

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;
}

有关详细信息,请查看:Declare variable inside or outside the loop?@Social.MSDN