2012-07-24 15 views
24

Próbuję:Konwersja z tablicy bajtów do base64 i powrót

  1. Generuje tablicę bajtów.
  2. Konwertuj tablicę bajtów na base64
  3. Konwertuj łańcuch base64 z powrotem na tablicę bajtów.

Wypróbowałem kilka rozwiązań, na przykład te w tym question.

Z jakiegoś powodu początkowe i końcowe tablice bajtów nie są zgodne. Oto kod używany:

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) 
    { 
     byte[] originalArray = new byte[32]; 
     rng.GetBytes(key); 
     string temp_inBase64 = Convert.ToBase64String(originalArray); 
     byte[] temp_backToBytes = Encoding.UTF8.GetBytes(temp_inBase64); 
    } 

moje pytania są następujące:

  1. Dlaczego "originalArray" i "temp_backToBytes" nie pasuje? (originalArray ma długość 32, temp_backToBytes ma długość 44, ale ich wartości również są różne)

  2. Czy można konwertować w tę iz powrotem, a jeśli tak, w jaki sposób mogę to zrobić?

Odpowiedz

30

Powód, dla którego kodowana tablica jest dłuższa o około jedną czwartą, oznacza, że ​​kodowanie base-64 używa tylko sześciu bitów na każdy bajt; to jest powód istnienia - kodować dowolne dane, ewentualnie zerami i innymi niedrukowalnymi znakami, w sposób odpowiedni do wymiany za pośrednictwem kanałów tylko ASCII, takich jak e-mail.

Sposób dostać oryginalną tablicę z powrotem jest za pomocą Convert.FromBase64String:

byte[] temp_backToBytes = Convert.FromBase64String(temp_inBase64); 
+0

To działało, chociaż jeśli base64 wykorzystuje tylko 6 z każdych 8 bitów, to myślę, że kodowanie będzie krótszy? – crawfish

+6

@crawfish Kodowanie wykorzystuje sześć z ośmiu bitów na wyjściu, pozostawiając dwie najbardziej znaczące wartości zerowe. W rezultacie każda grupa trzech bajtów ('3 * 8 = 24' bitów) staje się grupą czterech bajtów (' 4 * 6 = 24' bitów). Jeśli liczba bajtów w oryginale nie jest podzielna przez trzy, specjalne znaczniki są dodawane na końcu. W twoim przypadku następna liczba podzielna przez 3 większe niż 32 to 33, lub "11 * 3". Oznacza to, że wynikiem jest '11 * 4' lub 44 bajty. – dasblinkenlight

+0

Wielkie dzięki za wyjaśnienie – crawfish

Powiązane problemy