web-dev-qa-db-fra.com

Comment convertir une chaîne en tableau d'octets base64, serait-ce valide?

J'essaie d'écrire une fonction qui convertit une chaîne en un tableau d'octets base64. J'ai essayé avec cette approche:

public byte[] stringToBase64ByteArray(String input)
{
    byte[] ret = System.Text.Encoding.Unicode.GetBytes(input);
    string s = Convert.ToBase64String(input);
    ret = System.Text.Encoding.Unicode.GetBytes(s);
    return ret;
}

Cette fonction produirait-elle un résultat valide (à condition que la chaîne soit en unicode)? Merci!

33
Tomas Vinter

Ça a l'air bien, bien que l'approche soit étrange. Mais utilisez Encoding.ASCII.GetBytes () pour convertir la chaîne base64 en octet []. L'encodage Base64 ne contient que ASCII caractères. L'utilisation d'Unicode vous donne un octet supplémentaire de 0 pour chaque caractère.

20
Hans Passant

Vous pouvez utiliser:

de l'octet [] à la chaîne:

byte[] array = somebytearray;

string result = Convert.ToBase64String(array);

De la chaîne à l'octet []:

array = Convert.FromBase64String(result);

58
Sonhja

Représenter une chaîne comme un blob représenté comme une chaîne est étrange ... une raison pour laquelle vous ne pouvez pas simplement utiliser la chaîne directement?

La chaîne est toujours unicode; ce sont les octets codés qui changent. Puisque la base-64 est toujours <128, l'utilisation d'unicode dans la partie last semble exagérée (sauf si c'est ce que le format de fil exige). Personnellement, j'utiliserais UTF8 ou ASCII pour le dernier GetBytes afin que chaque caractère base-64 ne prenne qu'un octet.

2
Marc Gravell

Toutes les chaînes en .NET sont unicode. Ce code produira un résultat valide mais le consommateur de la chaîne BASE64 doit également être activé Unicode.

0
Darin Dimitrov

Oui, il produirait une chaîne encodée en base64 de la représentation petit-boutiste UTF-16 de votre chaîne source. Gardez à l'esprit que, AFAIK, il n'est pas vraiment courant d'utiliser UTF-16 en base64, ASCII ou UTF-8 est normalement utilisé. Cependant, l'important ici est que l'expéditeur et le récepteur convenir de l'encodage à utiliser.

Je ne comprends pas pourquoi vous reconvertissez la chaîne base64 en tableau d'octets: base64 est utilisé pour éviter les incompatibilités de codage lors de la transmission, vous devez donc le conserver sous forme de chaîne et le produire au format requis par le protocole que vous utilisez pour transmettre les données . Et, comme l'a dit Marc, il est certainement exagéré d'utiliser UTF-16 à cette fin, car base64 ne comprend que 64 caractères, tous sous 128.

0
Matteo Italia