2011-09-05 5 views

Répondre

10

Vous pouvez absolument convertir le sbyte[] à un byte[] - je peux garantir à peu près vous que le code Java vraiment être le traitement du tableau d'octets comme non signé. (Ou pour le dire autrement: base64 est seulement défini en termes d'octets non signés ...)

Il suffit de convertir byte[] et appeler Convert.ToBase64String. La conversion en byte[] est en fait vraiment facile - même si C# lui-même ne prévoit pas une conversion entre les deux, le CLR est très heureux d'effectuer une conversion de référence, de sorte que vous avez juste besoin de tromper le compilateur C#:

sbyte[] x = { -1, 1 }; 
byte[] y = (byte[]) (object) x; 
Console.WriteLine(Convert.ToBase64String(y)); 

Si vous voulez avoir un véritable byte[] vous pouvez copier:

byte[] y = new byte[x.Length]; 
Buffer.BlockCopy(x, 0, y, 0, y.Length); 

mais personnellement je bâton avec la première forme.

+0

Rapide. Quelqu'un me jette un lien vers les faits de john skeet. Je rigole. Le respect. – TigOldBitties

+0

Cela a un sens, comme le Convert.ToBase64String utilise des pointeurs pour obtenir la représentation binaire ... Et c'est un modèle ... –

+0

@NoProblemBabe: Les pointeurs sont vraiment pas pertinents ici, pour être honnête ... –

5
class Program 
{ 
    static void Main() 
    { 
     sbyte[] signedByteArray = { -2, -1, 0, 1, 2 }; 
     byte[] unsignedByteArray = (byte[])(Array)signedByteArray; 
     Console.WriteLine(Convert.ToBase64String(unsignedByteArray)); 
    } 
} 
+0

Désolé compagnon, en utilisant ce double casting assez souvent, je reçois une erreur sur un type de tableau de discordance. Spécialement en utilisant nhibernate. Mais merci –

+0

J'ai vu qu'il existe une méthode convertall dans la classe Array, où vous pouvez, par lambda, lancer chaque élément –

Questions connexes