2012-02-01 12 views
6

Próbuję zrozumieć następujące:Dlaczego funkcja C# Convert.ToBase64String() daje mi 88 jako długość, gdy przechodzę w 64 bajtach?

Jeśli deklaruję 64 bajty jako długość tablicy (bufor). Kiedy konwertuję na łańcuch podstawowy 64, mówi on, że długość wynosi 88. Czy długość nie powinna wynosić tylko 64, ponieważ przechodzę w 64 bajtach? Mogę całkowicie nie rozumieć, jak to działa. Jeśli tak, proszę wyjaśnić.

//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

Przy okazji: wyrzucenie wyjątku jest okropnym sposobem na zarejestrowanie prostej wartości ... –

+0

Ja osobiście nie użyłbym szyfrowania RGN, silna kryptograficznie RNG będzie wolniejsza --- wymaga więcej obliczeń --- i będzie spektralnie biały, – MethodMan

+0

Spójrz na to StackOverFlow Wyjaśnienie, dlaczego nie jest bezpiecznie używać RGN http://stackoverflow.com/questions/4892588/rngcryptoserviceprovider-random-number-review – MethodMan

Odpowiedz

8

Nie, kodowanie base-64 używa całego bajtu do reprezentowania sześciu bitów zakodowanych danych. Utracone dwa bity to cena użycia jedynie znaków alfanumerycznych plus i slash jako symboli (w zasadzie wykluczających liczby reprezentujące niewidoczne lub specjalne znaki w prostym kodowaniu ASCII/UTF-8). Wynik, który otrzymujesz, to (64 * 4/3) zaokrąglony w górę do najbliższej granicy 4-bajtowej.

6

Kodowanie Base64 konwertuje 3 oktety na 4 zakodowane znaki; zatem

(64/3) * 4 ≈ (22 * 4) = 88 bajtów.

Read here.

2

nie powinien mieć długość tylko 64, ponieważ jestem przekazując 64 bajtów?

Nie. Przekazujesz 64 żetony w notacji Base256. Base64 ma mniej informacji na token, więc potrzebuje więcej tokenów. 88 brzmi poprawnie.

Powiązane problemy