Base64 - dekodowanie dowolnego pliku

0

Mam plik PDF, który konwertowany jest do postaci Base64. Korzystam z wielu dekoderów on-line + napsiałem własny w c# i nigdy po zakodowaniu, zdekodowaniu i zapisaniu pliku, nie otrzymuję oryginału pliku pdf, ilość znaków w pliku się zgadza, ale część jest podmieniana. Platforma ePUAP (elektroniczna Platforma Usług Administracji Publicznej) przesyła wiadomości w postaci pliku XML, który trzyma w sobie załączniki w tagach <daneZalacznika>zalacznik_base64</daneZalacznika> w formacie base64, jednak jakbym tego nie konwertował, nigdy nie wychodzi oryginał, na przykładzie poniżej:
wysyłam pdf, którego plik (nie dokument po otworzeniu) zaczyna się od:

%PDF-1.5
%µµµµ

po odebraniu go z ePUAPu początek tagu zawierającego tego pdfa wygląda tak:

JVBERi0xLjUNCiW1tbW1DQo

gdy odkoduję za pomocą base64, otrzymuję:

%PDF-1.5
%����

Widać że znak µ stał się ďż˝
kodowanie xml to: <?xml version="1.0" encoding="UTF-8"?>
moja funkcja do dekodowania base64 to:

static public string DecodeFrom64(string encodedData)
        {
            byte[] encodedDataAsBytes
                = System.Convert.FromBase64String(encodedData);
            string returnValue =
               System.Text.UTF8Encoding.UTF8.GetString(encodedDataAsBytes);
            return returnValue;
        } 

Bawiąc się różnymi dekoderami on-line część dobrze wykrywa znak µ, ale wysypuje się na innych znakach i PDF nadal jest nie do odczytania.
Jak to ugryźć? Czy może się tak zdarzyć, że ePUAP psuje załączniki, bo nie obsługuje całej puli tablicy znaków?

0

Po dekodowaniu nie zapisuj tego w stringu tylko w tablicy bajtow. Zapisz ta tablice bajtow do pliku jako .pdf i sprawdz czy mozesz go otworzyc.

0

To nie jest kodowanie UTF8. To nie jest żadne kodowanie. Na takich danych pracuje się poprzez np. FileStream. Convert.FromBase64 zwraca tablicę bajtów i tę tablicę bajtów masz zapisać do pliku, bez koślawienia jej po drodze jakimiś konwersjami kodowania.

0

dzięki, dokładnie to było problemem.

Jakby ktoś miał taki sam problem w przyszłości to rozwiązała go funkcja do dekodowania z bezpośrednim zapisem do pliku po dekodowaniu:

 
static public void DecodeFrom64(string encodedData)
        {
            byte[] encodedDataAsBytes
                = System.Convert.FromBase64String(encodedData);
            File.WriteAllBytes(fileName, encodedDataAsBytes); 
            
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1