Convertir des.FromBase64String retourne unicode parfois, ou UTF-8

Parfois, le tableau d'octets b64 est UTF-8, et d'autres fois UTF-16. Je lis en ligne que C# les chaînes sont toujours UTF-16, mais ce n'est pas le cas pour moi ici. Pourquoi est-ce qui se passe, et comment puis-je résoudre ce problème? J'ai une méthode simple pour la conversion d'une chaîne base64 normale à la chaîne:

public static string FromBase64(this string input)
{
    String corrected = new string(input.ToCharArray());
    byte[] b64 = Convert.FromBase64String(corrected);
    if (b64[1] == 0)
    {
        return System.Text.Encoding.Unicode.GetString(b64);
    }
    else
    {
        return System.Text.Encoding.UTF8.GetString(b64);
    }

}

La même chose se passe pour ma base 64 encodeur:

public static string ToBase64(this string input)
{
    String b64 = Convert.ToBase64String(input.GetBytes());
    return b64;
}

public static byte[] GetBytes(this string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

Exemple:
Sur mon ordinateur, "cABhAHMAcwB3AG8AcgBkADEA" décode:

'p','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'a','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'s','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'s','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'w','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'o','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'r','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'d','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'
,'1','
'p','\0','a','\0','s','\0','s','\0','w','\0','o','\0','r','\0','d','\0','1','\0'
'

Mais sur mes collègues de l'ordinateur c'est:

'p','a','s','s','w','o','r','d','1'

Edit:

Je sais que la chaîne que je vient de créer une zone de texte, et que le fichier où je suis d'économie qu'il va toujours être en UTF-8, donc tout est pour le pointage de l'Convertir méthode la cause de mes codage switch.

Mise à jour:

Après creuser plus loin, il semble que mon collègue avait un pas très important a commenté dans sa version du code, celui qui enregistre la valeur lue à partir du fichier de la table de hachage. La valeur par défaut j'ai utilisé est UTF-8 base64 valeur, donc je vais corriger le défaut, à un utf-16 valeur, alors je peux nettoyer le code en supprimant tout UTF8 références.

Aussi, j'avais été naïvement à l'aide de l'UTF-8 est un encodage base64 j'avais récupéré à partir d'un site web, ne réalisant pas ce qui m'attendait. Le plus drôle, c'est que je n'aurais jamais trouvé que fait, si mon collègue n'avait pas commenté la ligne qui enregistre les valeurs dans le fichier.

Version finale du code:

public static string FromBase64(this string input)
{
    byte[] b64 = Convert.FromBase64String(input);
    return System.Text.Encoding.Unicode.GetString(b64);
}

public static string ToBase64(this string input)
{
    String b64 = Convert.ToBase64String(input.GetBytes());
    return b64;
}

public static byte[] GetBytes(this string str)
{
    return System.Text.Encoding.Unicode.GetBytes(str);
}
Qu'est-ce que String corrected = new string(input.ToCharArray()); censé faire? Il ne fait aucun sens.
C'était une tentative pour obtenir la sortie à jouer très bien. J'ai pensé qu'il n'aurait aucun effet sur la sortie, et il n'a pas, je n'ai tout simplement pas l'enlever avant de poster la question.

OriginalL'auteur david.tanner | 2014-01-21