private Arraylist split(byte[] filebytes, int range)
{
}
如何按给定范围拆分此文件字节,即范围是100 应该将文件字节分开100kb并将其放入arraylist直到eof。 我只有.net框架1.1 ...提前感谢。
答案 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