2010-02-19 15 views
30

Estoy tratando de escribir una función que convierta una cadena en una matriz de bytes base64. Lo he intentado con este enfoque:Cómo convertir una cadena en una matriz de bytes base64, ¿sería esto válido?

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; 
} 

¿Esta función produciría un resultado válido (siempre que la cadena esté en Unicode)? Gracias!

+1

¿Qué es exactamente una matriz de bytes base64? baseNN se aplica a las representaciones de texto. –

+1

@Henk: creo que se refiere a una cadena Base64 convertida en una matriz de bytes. – Bobby

+0

ToBase64String espera el tipo byte [], mientras proporciona la cadena – Adeel

Respuesta

18

Se ve bien, aunque el enfoque es extraño. Pero use Encoding.ASCII.GetBytes() para convertir la cadena base64 en byte []. La codificación Base64 solo contiene caracteres ASCII. El uso de Unicode te proporciona un byte extra de 0 para cada personaje.

+0

Gracias! Seguiré tu consejo y usar Encoding.ASCII.GetBytes() en su lugar. –

2

Representar una cadena como una burbuja representada como una cadena es impar ... ¿Hay alguna razón por la que no pueda usar la cadena directamente?

La cadena es siempre Unicode; son los bytes codificados los que cambian. Como base-64 siempre es < 128, el uso de unicode en la última parte parece excesivo (a menos que eso exija el formato de cable). Personalmente, usaría UTF8 o ASCII para el último GetBytes de modo que cada carácter de base 64 solo tome un byte.

+1

Sí, es impar. La razón por la que lo hacemos es porque estoy haciendo llamadas a una API de un viejo sistema heredado que, por alguna razón, quiere que las cadenas pasen como matrices de base64 bytes. –

0

Todas las cadenas en .NET son unicode. Este código producirá un resultado válido, pero el consumidor de la cadena BASE64 también debe estar habilitado para Unicode.

0

Sí, produciría una cadena codificada en base64 de la representación little-endian UTF-16 de la cadena de origen. Tenga en cuenta que, AFAIK, no es realmente común usar UTF-16 en base64, normalmente se usa ASCII o UTF-8. Sin embargo, lo importante aquí es que el emisor y el receptor acuerden qué codificación debe usarse.

No entiendo por qué reconvierte la cadena base64 en una matriz de bytes: base64 se usa para evitar incompatibilidades de codificación al transmitir, por lo que debe guardarlo como una cadena y mostrarlo en el formato requerido por el protocolo que utiliza para transmitir los datos. Y, como dijo Marc, definitivamente es excesivo usar UTF-16 para ese propósito, ya que base64 incluye solo 64 caracteres, todo bajo 128.

52

Se puede utilizar:

De byte [] para cadena:

byte[] array = somebytearray;

string result = Convert.ToBase64String(array);

de String a byte []:

array = Convert.FromBase64String(result);

Cuestiones relacionadas