2012-02-01 15 views
6

Estoy tratando de entender lo siguiente:¿Por qué C# Convert.ToBase64String() me da 88 como longitud cuando paso en 64 bytes?

Si declaro 64 bytes como la longitud de la matriz (buffer). Cuando me convierto en una cadena base 64, dice que la longitud es 88. ¿No debería ser solo la longitud 64, ya que estoy pasando 64 bytes? Podría estar totalmente equivocado sobre cómo funciona esto realmente. Si es así, ¿podrías explicarme?

//Generate a cryptographic random number 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 

// Create byte array 
byte[] buffer = new byte[64]; 

// Get random bytes 
rng.GetBytes(buffer); 

// This line gives me 88 as a result. 
// Shouldn't it give me 64 as declared above? 
throw new Exception(Convert.ToBase64String(buffer).Length.ToString()); 

// Return a Base64 string representation of the random number 
return Convert.ToBase64String(buffer); 
+4

Por cierto: lanzar una excepción es una forma horrible de registrar un valor simple ... –

+0

No usaría Cifrado RGN personalmente, Un RNG criptográficamente fuerte será más lento --- requiere más computación --- y será espectralmente blanco, – MethodMan

+0

Mire este StackOverFlow Explicación de por qué no es seguro usar RGN http://stackoverflow.com/questions/4892588/rngcryptoserviceprovider-random-number-review – MethodMan

Respuesta

8

No, la codificación de base-64 utiliza un byte completo para representar seis bits de los datos que se están codificando. Los dos bits perdidos son el precio de usar solo caracteres alfanuméricos, más y barras como sus símbolos (básicamente, excluyendo los números que representan caracteres no visibles o especiales en la codificación simple ASCII/UTF-8). El resultado que obtiene es (64 * 4/3) redondeado al límite de 4 bytes más cercano.

6

La codificación de Base64 convierte 3 octetos en 4 caracteres codificados; por lo tanto

(64/3) * 4 ≈ (22 * 4) = 88 bytes.

Read here.

2

¿No debería ser la longitud única de 64 años, ya que me estoy pasando de 64 bytes?

No. Estás pasando 64 tokens en notación de Base256. Base64 tiene menos información por token, por lo que necesita más tokens. 88 suena sobre correcto.

Cuestiones relacionadas