2013-07-17 48 views
0

我有一個byte []數組表示任意長度,我想將它拆分成多個部分,每個部分的長度爲2205,我將不得不對這些2205個字節進行操作,這裏是我的算法:C#將數組拆分成固定數量的範圍

// SPLIT BY 2205 Bytes 
int block = 2205; 
int counter = 0; 
byte[] to_Send = new byte[block]; 
foreach (byte b in ARCHIEVE_BUFFER) 
{ 
    if (counter < 2205) 
    { 
     to_Send[counter] = b; 
     counter++; 
    } 
    else if (counter == 2205) 
    { 
     // do some operation on those 2205 bytes which stored on the array to_send 

     counter = 0; 
     to_Send[counter] = b; 
     counter++; 
    } 
} 

我只是想拆分陣列分爲固定數量的範圍

+5

你的問題是什麼? – driis

+0

你可能想看看'Array.Copy'。 –

+0

你的問題是什麼?我認爲你的措辭很混亂。問題標題聽起來像你想要固定數量的子集,但問題主體使得它聽起來像你想要的子集的固定大小和儘可能多的數量.. – evanmcdonnal

回答

3

使用LINQ可以再次的陣列分成blocksize字節塊

int count=0; 
int blocksize = 2205; 
List<List<byte>> blocks = ARCHIEVE_BUFFER 
          .GroupBy(_ => count++/blocksize) 
          .Select(x=>x.ToList()) 
          .ToList(); 
+0

有趣的代碼,但你認爲它會是高性能的嗎? (這不是真的很重要,但只是爲了知道) – Steve

+0

其實它非常棒! – BOSS

0

的創建一個新的數組,並使用Buffer.BlockCopy這一點。 對數組進行迭代並複製每個字節的字節安靜無法執行。

byte[] toSend = null; 
int Remaining = ARCHIEVE_BUFFER.Length; 
int Packed = 0; 

while(Remaining > 0){ 
    toSend = new byte[Remaining >= block ? block : Remaining]; 
    Buffer.BlockCopy(toSend, 0, ARCHIEVE_BUFFER, Packed, toSend.Length); // not sure about params 
    Packed += toSend.Length; 
    Remaining -= toSend.Length; 

    // todo: send here 
} 
+1

你可以使用Math.Min而不是三元組。 –

+0

將是一個容易閱讀的方式!我經常使用三元組(也是在JavaScript中),因爲它認爲這比在堆棧中移動數據(或者堆或在寄存器中)要快 - 這取決於參數傳遞給機器的方式。我不確定Math.Min是如何在IL中翻譯的 - 也許它只是簡化爲三元。 –

+0

這是我見過的最小的優化。只需使用Math.Min。 –

1

類陣列具有從一個陣列複製到另一個陣列從在兩個陣列的位置和用於指定長度的啓動靜態方法

Array.Copy(array1, pos1, array2, pos2, length)

int block = 2205; 
int counter = 0; 
byte[] to_Send = new byte[block]; 
Array.Copy(ARCHIEVE_BUFFER, 0, to_Send, 0, 2205); 

目前還不清楚你想用to_Send數組填充第一個塊,但是應該很容易在Array.Copy上添加一個循環,以改變每個循環的起始位置並使用從ARCHIEVE_BUFFER提取的新數據

0

使用Array.Copy方法或Buffer.BlockCopy如上所述。但是,在性能危急的情況下,請使用BlockCopy

Array.Copy(sourceArray, 0, destinationArray, 0, size); 

Buffer.BlockCopy(sourceArray, 0, destinationArray, 0, size); 
0

或者另一種方式,通過使用Enumerable.SkipEnumerable.Take

//ARCHIEVE_BUFFER: source array 
//block: the size of slice 
for(var i=0; i<ARCHIEVE_BUFFER.Length;i+=block) { 
    var to_Send = ARCHIEVE_BUFFER.Skip(i).Take(block); 
    ProcessSubArray(to_Send); 
}