2009-05-06 9 views
28

J'ai une fonction qui remplit un tableau de type sbyte [], et j'ai besoin de passer ce tableau à une autre fonction qui accepte un paramètre de type byte []. Puis-je le convertir facilement et rapidement, sans copier toutes les données ou en utilisant unsafe magic?Comment convertir un sbyte [] en octet [] en C#?

+0

vient d'ajouter quelques espaces à la Q, espère que vous ne me dérange pas: D – inspite

Répondre

42

Oui, vous pouvez. Comme les deux byte et sbyte ont la même représentation binaire, il n'est pas nécessaire de copier les données. Faites simplement un casting sur Array, puis lancez-le sur byte[] et ce sera suffisant.

sbyte[] signed = { -2, -1, 0, 1, 2 }; 
byte[] unsigned = (byte[]) (Array)signed; 
+0

Wow, génial! Je n'avais pas pensé à ça. : P –

+4

Assez souvent, je reçois un type de tableau de discordance en utilisant cette approche –

+0

J'ai essayé mais cela fonctionne. Les résultats étaient des points d'interrogation. Quelque chose que je n'ai jamais vu auparavant. Voici le code 'sbyte [] txdata = {(0x00 | 0x20), ~ (1 << 6)}; byte [] dss = (octet []) ((Array) txdata); ' –

24

Vous devrez copier les données (seules les matrices de type référence sont covariantes) - mais nous pouvons essayer de le faire efficacement; Buffer.BlockCopy semble fonctionner:

sbyte[] signed = { -2, -1, 0, 1, 2 }; 
    byte[] unsigned = new byte[signed.Length]; 
    Buffer.BlockCopy(signed, 0, unsigned, 0, signed.Length); 

Si c'était un type de référence, vous pouvez simplement jeté la référence sans dupliquer le tableau:

Foo[] arr = { new Foo(), new Foo() }; 
    IFoo[] iarr = (IFoo[])arr; 
    Console.WriteLine(ReferenceEquals(arr, iarr)); // true 
+0

Eh oui ... mais lire la dernière phrase de la question. ;) –

+0

Édité pour inclure la note sur la covariance –

+0

Vraiment ??? Vous fournissez une réponse en incluant "les tableaux de type de référence sont covariants"? Allez, au moins essayer d'être utile sans le bling sémantique auto-gratifiant. – BoiseBaked

6

Si vous utilisez 3.5+ .NET, vous pouvez utiliser ce qui suit:

byte[] dest = Array.ConvertAll(sbyteArray, (a) => (byte)a); 

Qui est, je suppose que la copie efficace de toutes les données.

Notez que cette fonction est également dans .NET 2.0, mais vous devrez utiliser une méthode anonyme à la place.

+0

Pouah. Je préfère utiliser Buffer.BlockCopy() alors. Cela copie au moins aveuglément un tas d'octets. Celui-ci a un appel de fonction pour chacun d'eux. Cauchemar de performance. –

+1

Eh bien, tout dépend de combien vous copiez, mais oui, la copie de bloc a plus de sens. En fin de compte, si vous voulez la sécurité de type, la seule façon est de copier. Si vous voulez convertir (re-cast) le tableau, le danger est la seule façon d'y aller. – Clinton

+0

LOL! Ou vous pouvez faire la même chose sans le surcoût: byte [] foo = (byte []) (Array) signed; – BoiseBaked

Questions connexes