Jeśli jest to pytanie i odpowiedź „dzielenie się wiedzą”, myślę, że szukamy czegoś bardziej dogłębnego. Pojawia się również szybkie wyszukiwanie SO: stackoverflow.com/a/7368168/419
Kev
1
@Gnark Każdy ciąg znaków jest kodowany przez pewien podstawowy schemat kodowania bitów. Czy to ASCII, UTF7, UTF8, ... Zadane pytanie jest w najlepszym razie niepełne.
Lorenz Lo Sauer,
2
Zadaj sobie pytanie, czy naprawdę musisz to zrobić? Pamiętaj, że base64 jest przeznaczony przede wszystkim do reprezentowania danych binarnych w ASCII, do przechowywania w polu char w bazie danych lub wysyłania przez e-mail (gdzie można wstawić nowe linie). Czy naprawdę chcesz pobrać dane znakowe, przekonwertować je na bajty, a następnie przekonwertować z powrotem na dane znakowe, tym razem nieczytelne i bez cienia oryginalnego kodowania?
bbsimonbb
Dlaczego powinniśmy dbać o oryginalne kodowanie? Kodujemy ciąg znaków do bajtów za pomocą reprezentacji UTF8, która może reprezentować wszystkie możliwe znaki ciągu. Następnie serializujemy te dane, a z drugiej strony deserializujemy te dane i odtwarzamy ten sam ciąg znaków, który pierwotnie mieliśmy (obiekt ciągu i tak nie przechowuje informacji o użytym kodowaniu). Dlaczego więc istnieją jakiekolwiek obawy związane z zastosowanym kodowaniem? Możemy uznać to za zastrzeżony sposób reprezentowania serializowanych danych, co i tak nie powinno nas zainteresować.
Null sprawdza ciągi wejściowe w obu funkcjach i rozwiązanie jest idealne :)
Sverrir Sigmundarson
22
@SverrirSigmundarson: That lub uczyń je metodami rozszerzenia.
TJ Crowder
73
@SverrirSigmundarson - Dlaczego czek zerowy? On nie jest tym, który wyłuskuje ciąg wejściowy. Czeki zerowe powinny zapobiegać NullReferenceExceptionw twoim własnym kodzie, a nie cudzym.
Ken
16
@ken A ktoś inny powie „powinieneś ujawniać tylko błędy we własnym kodzie, a nie cudzego”, powołując się na zasadę najmniejszego zaskoczenia, doprawioną „wczesnym niepowodzeniem” i „właściwym enkapsulacją”. Czasami oznacza to błędy owijania komponentów niższego poziomu, a czasem coś zupełnie innego. W tym przypadku zgodzę się, że zawinięcie błędu deref jest zdecydowanie wątpliwe (plus wszyscy powoli zgadzamy się z faktem, że zero jako koncepcja jest trochę hack na początku), ale wciąż możemy zobaczyć pewne efekty w przeciwnym razie: nazwa parametru podana w wyjątku może być niepoprawna, jeśli nie zostanie zaznaczona.
tne
6
return System.Text.Encoding.UTF8.GetString (base64EncodedBytes, 0, base64EncodedBytes.Length); dla Windows Phone 8
Steveen Zoleko
46
Udostępniam moją implementację z kilkoma ciekawymi funkcjami:
używa metod rozszerzenia dla klasy kodowania. Uzasadnieniem jest to, że ktoś może potrzebować obsługi różnych rodzajów kodowania (nie tylko UTF8).
Kolejna poprawa kończy się niepowodzeniem z wynikiem zerowym dla wpisu zerowego - jest to bardzo przydatne w rzeczywistych scenariuszach i obsługuje równoważność dla X = dekodowania (kodowania (X)).
Uwaga: Pamiętaj, że aby użyć metody rozszerzenia, musisz (!) Zaimportować przestrzeń nazw ze usingsłowem kluczowym (w tym przypadku using MyApplication.Helpers.Encoding).
Powrót nullw przypadku nulljest bardzo niespójnym zachowaniem. Nie robi tego żaden inny interfejs API .net współpracujący z łańcuchami.
t3chb0t
4
@ t3chb0t dostosuj go do swoich potrzeb. Sposób prezentacji został dostosowany do naszego. To nie jest publiczny interfejs API;)
andrew.fox
1
Czy nie musisz teraz wysyłać 2 zmiennych do drugiej strony w komunikacji (do której wysyłasz dane zakodowane w standardzie base64)? Musisz wysłać zarówno użyte kodowanie, jak i rzeczywiste dane base64? Czy nie jest łatwiej, jeśli użyjesz konwencji po obu stronach, aby użyć tego samego kodowania? W ten sposób będziesz musiał tylko wysyłać dane base64, prawda?
Mladen B.
38
Na podstawie odpowiedzi Andrew Foxa i Cebe odwróciłem go i utworzyłem z nich rozszerzenia ciągów zamiast rozszerzeń Base64String.
Narzędzia online nie pomagają w tej sytuacji - pyta, jak KODOWAĆ. Często zastanawiam się, dlaczego ludzie mówią „Sprawdź to narzędzie online!”, Ponieważ OP nie poprosił o narzędzie online: D
publicstaticclassBase64Url{publicstaticstringEncode(string text){returnConvert.ToBase64String(Encoding.UTF8.GetBytes(text)).TrimEnd('=').Replace('+','-').Replace('/','_');}publicstaticstringDecode(string text){
text = text.Replace('_','/').Replace('-','+');switch(text.Length%4){case2:
text +="==";break;case3:
text +="=";break;}returnEncoding.UTF8.GetString(Convert.FromBase64String(text));}}
Pytanie nie dotyczyło kodowania adresów URL, ale nadal było pomocne ...
Momoro
Ups, opublikował to pod niewłaściwym pytaniem
juliushuck
Nie ma problemu, nadal ciekawe jest, jak kodować / dekodować adres URL :)
Momoro
3
Możesz wyświetlić go w następujący sposób:
var strOriginal = richTextBox1.Text;byte[] byt =System.Text.Encoding.ASCII.GetBytes(strOriginal);// convert the byte array to a Base64 stringstring strModified =Convert.ToBase64String(byt);
richTextBox1.Text=""+ strModified;
Teraz konwertowanie go z powrotem.
var base64EncodedBytes =System.Convert.FromBase64String(richTextBox1.Text);
richTextBox1.Text=""+System.Text.Encoding.ASCII.GetString(base64EncodedBytes);MessageBox.Show("Done Converting! (ASCII from base64)");
Istnieją różne wersje Base64, które nie zgadzają się co do tego, co należy stosować dla cyfr 62 i 63, więc DecodeBase64Digitmoże tolerować kilka z nich.
Odpowiedzi:
Kodować
Rozszyfrować
źródło
NullReferenceException
w twoim własnym kodzie, a nie cudzym.Udostępniam moją implementację z kilkoma ciekawymi funkcjami:
Uwaga: Pamiętaj, że aby użyć metody rozszerzenia, musisz (!) Zaimportować przestrzeń nazw ze
using
słowem kluczowym (w tym przypadkuusing MyApplication.Helpers.Encoding
).Kod:
Przykład użycia:
źródło
null
w przypadkunull
jest bardzo niespójnym zachowaniem. Nie robi tego żaden inny interfejs API .net współpracujący z łańcuchami.Na podstawie odpowiedzi Andrew Foxa i Cebe odwróciłem go i utworzyłem z nich rozszerzenia ciągów zamiast rozszerzeń Base64String.
źródło
Niewielka odmiana odpowiedzi andrew.fox, ponieważ ciąg do dekodowania może nie być poprawnym ciągiem zakodowanym w standardzie base64:
źródło
Poniższej procedury można użyć do konwersji ciągu znaków na format base64
Możesz także użyć bardzo dobrego narzędzia online OnlineUtility.in do zakodowania łańcucha w formacie base64
źródło
Stosowanie
źródło
Bezpieczny adres URL Kodowanie / dekodowanie Base64
źródło
Możesz wyświetlić go w następujący sposób:
Teraz konwertowanie go z powrotem.
Mam nadzieję, że to pomoże!
źródło
Dla tych, którzy po prostu chcą kodować / dekodować poszczególne cyfry base64:
Istnieją różne wersje Base64, które nie zgadzają się co do tego, co należy stosować dla cyfr 62 i 63, więc
DecodeBase64Digit
może tolerować kilka z nich.źródło