2009-08-05 130 views
1
private Arraylist split(byte[] filebytes, int range) 
{ 
} 

如何如果範圍是100它 應該由100KB分裂filebytes並把這個入數組列表,直到在EOF拆分此filebytes由給定的範圍即。 我只有.NET Framework 1.1 ...提前致謝。分裂byte []數組

回答

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

緩衝區大小有點隨意,但它應該足夠大。

+0

你要複製的東西成contb,驗證它爲空後。您需要先分配數組。我失去了你想要達到的目標。閱讀,拆分,連接,寫?對我沒有意義。 – Thorarin 2009-08-05 06:44:55

+0

正在使用套接字進行文件傳輸編...所有文件都非常lorge所以在這裏我必須拆分文件併發送到服務器。服務器ll 連接所有字節,最後寫一個文件,這是這個項目的目標....現在希望達到它。非常感謝。 – 2009-08-05 07:00:29

0

那麼,如果我正確地理解了這個,你想和ArrayListbyte[]大小100000?我無法爲你編寫代碼(目前沒有VS),但最有效的方法是創建新的數組對象,並使用Array.Copy()將大數組中的數據複製到一堆較小的數組中。

-1

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

有關詳細信息看:Declare variable inside or outside the [email protected]