2010-07-08 120 views
4

我想創建一個字節[]給出一些未知數量的字節。以下是一個示例:如何在C#中創建未知大小的字節[]?

ArrayList al = new ArrayList(); 
al.Add(0xCA); 
al.Add(0x04); 
byte[] test = (byte[])al.ToArray(typeof(byte)); 

我收到一個錯誤,指出數組中的一個或多個值無法轉換爲字節。我在這裏做錯了什麼?

感謝

回答

9

要麼使用一個通用的集合,而不是一個非泛型ArrayList,或請確保您實際使用的字節。 0xCA是int,而不是byte

 ArrayList al = new ArrayList(); 
     al.Add((byte)0xCA); 
     al.Add((byte)0x04); 
     byte[] test = (byte[])al.ToArray(typeof(byte)); 
+0

啊,我以爲0x把它變成了一個字節。我的錯。 – FoppyOmega 2010-07-08 14:54:44

+2

不,0x只是使它成爲一個十六進制整數,低於8位的任何0x數字都被認爲是一個Int32(但是如果數字的數目分別低於2/4,則隱含地可轉換爲字節/短) – fbstj 2010-07-08 14:59:59

+0

使用ArrayList,您正在裝箱和拆箱字節對象可以產生顯着的性能影響。使用通用名單可防止發生拳擊並提供更好的表現。 – 2010-07-08 15:46:48

11

嘗試List<byte>然後使用ToArray的

+0

.. al.Add會發生什麼(0xCA);與名單?編譯器錯誤? – JBRWilkinson 2010-07-08 14:53:51

+2

不,通用列表只允許添加通用類型,如果它們足夠小,則0x數字可隱式轉換爲較低類型(比其默認Int32)。 – fbstj 2010-07-08 15:01:39

0

使用List<byte>像下面。當你使用ArrayList,然後調用al.Add(0xCA)時,你實際上是在向ArrayList中添加int。

List<byte> al = new List<byte>(); 
...