2010-08-08 11 views
1

en C++:Convertir C++ C#

byte des16[16]; 
.... 
byte *d = des16+8; 

en C#?

byte des16[16]; 
    [0] 207 'Ï' unsigned char 
    [1] 216 'Ø' unsigned char 
    [2] 108 'l' unsigned char 
    [3] 93 ']' unsigned char 
    [4] 249 'ù' unsigned char 
    [5] 249 'ù' unsigned char 
    [6] 100 'd' unsigned char 
    [7] 0 unsigned char 
    [8] 76 'L' unsigned char 
    [9] 50 '2' unsigned char 
    [10] 104 'h' unsigned char 
    [11] 118 'v' unsigned char 
    [12] 104 'h' unsigned char 
    [13] 191 '¿' unsigned char 
    [14] 171 '«' unsigned char 
    [15] 199 'Ç' unsigned char 

after 
byte *d = des16+8; 
d = "L2hvh¿«Ç†¿æ^ òÎL2hvh¿«Ç" 

Répondre

2

Je pense que ce serait plus approprié (même si cela dépend de la façon dont d est utilisé):

byte[] des16 = new byte[16]; 
IEnumerable<byte> d = des16.Skip(8); 

En utilisant le code managé pur, vous ne pouvez pas utiliser des pointeurs vers des endroits. Puisque d prend un pointeur sur le 8ème élément du tableau, l'analogue le plus proche serait de créer une énumération de des16 ignorant les 8 premiers éléments. Si vous êtes juste en train de parcourir les éléments, ce serait le meilleur choix.

Je dois également mentionner que Skip() est l'une des nombreuses méthodes d'extension disponibles pour les tableaux (et autres IEnumerable s) dans .Net 3.5 (VS2008/VS2010) et jusqu'à ce que je pouvais seulement supposer que vous utilisiez. Vous ne seriez pas capable de l'utiliser si vous utilisez .Net 2.0 (VS2003/VS2005).

Si d est utilisé pour accéder aux éléments de décalage dans des16 comme un tableau, il pourrait également être converti en tableau.

byte[] d = des16.Skip(8).ToArray(); 

Notez cela crée une instance distincte d'un tableau qui contient les éléments des16 à l'exception du premier 8.

Sinon, il est pas tout à fait clair que la meilleure utilisation serait sans voir comment il est utilisé.

[modifier]

Il semble que vous travaillez avec des chaînes terminées par null dans un tampon en .Net 2.0 peut (si Skip() n'est pas disponible). Si vous voulez la représentation sous forme de chaîne, vous pouvez la convertir en un objet chaîne natif.

byte[] des16 = new byte[16]; 
char[] chararr = Array.ConvertAll(des16, delegate(byte b) { return (char)b; }); //convert to an array of characters 
string str = new String(chararr, 8, chararr-8); //create the string 
+0

Vrai, mais cela demandera quelques explications à un C++ - go-er. – Dykam

+0

Point pris. Je devrais élaborer. –

+0

Merci les gars mais toujours pas. 'System.Array' ne contient pas de définition pour 'Skip'. – edv4ld0

9

C# (généralement parlant) n'a aucun pointeur. Peut-être que ce qui suit est ce que vous recherchez:

byte[] des16 = new byte[16]; 
byte byteAtIndex8 = des16[8]; 

Ce code vous donne l'élément à l'index 8.

Si je lis correctement, vous votre code tente d'obtenir l'adresse de l'élément à l'index 8 Ceci n'est généralement pas possible avec C# (sauf si vous utilisez un code dangereux).

+0

Merci les gars mais toujours pas. – edv4ld0

0
byte[] des16 = new byte[16]; 
.... 
byte d = des16[8]; 

vous pouvez Sauf si vous utilisez du code non sécurisé ne pas récupérer un pointeur.

+0

Merci les gars mais toujours pas. – edv4ld0

0

@JeffMercado, Merci d'avoir ouvert mes yeux.

en C++:

byte des16[16]; 
byte *d = des16+8; 

en C#:

byte[] des16 = new byte[16]; 
byte[] b = new byte[8]; 
System.Array.Copy(des16, 8, b, 0, 8); 
0

Pointeurs sont essentiellement se convertir. Nous pouvons le changer en collection en C#. En C++, si vous avez besoin de modifier collection (chaîne) en byte [] collection dans C#, vous pouvez exécuter du code comme ci-dessous.

octet [] àBytes = Encodage.ASCII.GetBytes (somestring);