2012-08-30 44 views
1

您好,我有這種陣列的如何將int數組值複製到字節數組中?僅在C#中的值複製

int[] arrayint = new int[32]; 

,它包含

arrayint[0] = 99 
arrayint[1] = 121 
arrayint[2] = 99 
arrayint[3] = 66 
... 

有一個簡單的辦法是整數數組複製到一個字節數組像我想使這個字節數組

byte[] streambit; 

,它應該是相同的arrayint值

我想是這樣的輸出

streambit[0] = 99 
streambit[1] = 121 
streambit[2] = 99 
streambit[3] = 66 
... 

回答

5
streambit = arrayint.Select(i => (byte)i).ToArray(); 

只要確保你有沒有價值大於255

+1

您可能想補充說,沒有負值應該是那麼以及相應的字節在這種情況下將不會是'相同的'... –

+0

這裏需要注意的一點是,任何大於255或小於0的整數都將以包裝方式轉換,而不會引發溢出異常。例如:-1將轉換爲255,256將轉換爲0. –

+0

這就是它非常感謝你...你能解釋我的代碼嗎?我對i =>(byte)的含義感到困惑i).ToArray()這是如何產生字節的? – Gamma

0
streambit=arrayint.Where(x=>x>=0&&x<=255).Select(y=>(byte)y).ToArray(); 
2

沒有LINQ(有用瞄準NET 2.0例如,當):

byte[] bytearray = Array.ConvertAll<int, byte>(arrayint, (z) => (byte)z); 

好耶,遠遠超過LINQ速度更快:

測試代碼(可以改進,但是這給一個想法):

private static void Main(string[] args) 
{ 
    int[] arrayint = new int[40000]; 

    arrayint[0] = 99; 
    arrayint[1] = 157; 
    arrayint[2] = 1; 
    arrayint[3] = 45; 

    byte[] bytearray; 

    Stopwatch sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000; i++) 
    { 
     bytearray = Array.ConvertAll<int, byte>(arrayint, (z) => (byte)z); 
    } 

    sw.Stop(); 
    Console.WriteLine("ConvertAll took {0} ms", sw.ElapsedMilliseconds); 

    sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 10000; i++) 
    { 
     bytearray = arrayint.Select(z => (byte)z).ToArray(); 
    } 

    sw.Stop(); 
    Console.WriteLine("LINQ took {0} ms", sw.ElapsedMilliseconds); 

    Console.ReadLine(); 
} 

結果:

ConvertAll了1865年毫秒

LINQ花了6073毫秒

+0

我第一次聽說'Array.ConvertAll'。似乎確實是一個更好的選擇。執行Linq查詢時,結果存儲在內部緩衝區中,然後複製到數組中。 'Array.ConvertAll'直接分配一個數組並在複製過程中進行轉換。這可能解釋了巨大的性能改進。 –