2010-07-08 9 views
4

J'essaye de créer un byte [] donné une quantité inconnue d'octets. Voici un exemple:Comment créer un octet [] de taille inconnue en C#?

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

Je reçois une erreur que l'un ou plusieurs des valeurs du tableau ne peut pas être converti en un octet. Qu'est-ce que je fais mal ici?

Merci

Répondre

9

Soit utiliser une collection générique au lieu d'un ArrayList non générique, ou assurez-vous que vous utilisez réellement octets. 0xCA est un int, pas un byte.

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

ah, je pensais que le 0x l'a fait dans un octet. Ma faute. – FoppyOmega

+2

non, 0x en fait un entier hexadécimal, tout nombre 0x en dessous de 8 chiffres est considéré comme un Int32 (mais implicitement convertible en byte/short si le nombre de chiffres est inférieur à 2/4 respectivement) – fbstj

+0

En utilisant ArrayList vous boxez et déballez le octets à des objets qui peuvent produire un impact significatif sur les performances. L'utilisation de la liste générique empêche la boxe de se produire et donne de meilleures performances. –

11

Essayez List<byte> puis utilisez ToArray

+0

.. Qu'arriverait-il à al.Add (0xCA); avec la liste ? Erreur de compilateur? – JBRWilkinson

+2

non, les listes génériques vous permettent uniquement d'ajouter le type générique, et les nombres 0x sont implicitement convertibles en types inférieurs (à leur type Int32 par défaut) s'ils sont suffisamment petits. – fbstj

0

Utilisez List<byte> comme ci-dessous. Lorsque vous utilisez ArrayList et que vous appelez al.Add (0xCA), vous ajoutez réellement des int à ArrayList.

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