Chciałbym base64
kodować i dekodować, ale nie mogłem znaleźć wsparcia z iPhone'a SDK
. Jak mogę base64
kodować i dekodować z biblioteką lub bez?
ios
objective-c
base64
BlueDolphin
źródło
źródło
Odpowiedzi:
Jest to sprawa dobrego wykorzystania na Objective C kategoriach .
W przypadku kodowania Base64:
W przypadku dekodowania Base64:
źródło
Naprawdę bardzo szybka implementacja, która została przeniesiona (i zmodyfikowana / ulepszona) z biblioteki PHP Core do natywnego kodu Objective-C jest dostępna w klasie QSStrings z biblioteki QSUtilities . Zrobiłem szybki test porównawczy: plik obrazu w formacie 5,3 MB (JPEG) kodował <50 ms, a dekodowanie - około 140 ms.
Kod dla całej biblioteki (w tym metod Base64) jest dostępny na GitHub .
Lub, jeśli chcesz, aby kod był tylko metodami Base64, opublikowałem go tutaj:
Najpierw potrzebujesz tabel mapowania:
Aby zakodować:
Aby zdekodować:
źródło
strResult
w enkoderze wydaje się przeciekać; potrzebuje tylkofree()
na końcu (przed powrotem, ale późniejNSString stringWithCString
)encodeBase64WithData:
metodzie pierwszy parametr w wywołaniu niecalloc()
musi być zwiększany o 1, aby uwzględnić terminator zerowy ('\0'
), który dodajesz na końcu?Historycznie kierowalibyśmy cię do jednej z wielu zewnętrznych bibliotek 64 bazowych (jak omówiono w innych odpowiedziach) w celu konwersji danych binarnych na ciąg 64 bazowy (i wstecz), ale iOS 7 ma teraz natywne kodowanie bazowe 64 (i ujawnia wcześniej prywatne metody iOS 4, na wypadek, gdybyś musiał obsługiwać wcześniejsze wersje iOS).
Zatem do konwersji
NSData
naNSString
podstawową reprezentację 64 możesz użyćbase64EncodedStringWithOptions
. Jeśli musisz obsługiwać również wersje iOS wcześniejsze niż 7.0, możesz:Aby przekonwertować bazę 64 z
NSString
powrotemNSData
, możesz użyćinitWithBase64EncodedString
. Podobnie, jeśli potrzebujesz obsługiwać wersje iOS wcześniejsze niż 7.0, możesz:Oczywiście, jeśli nie potrzebujesz wstecznej kompatybilności z wersjami iOS wcześniejszymi niż 7.0, jest to nawet łatwiejsze, po prostu użyj
base64EncodedStringWithOptions
lubinitWithBase64EncodedString
, odpowiednio, i nie zawracaj sobie głowy sprawdzaniem czasu działania wcześniejszych wersji iOS. W rzeczywistości, jeśli użyjesz powyższego kodu, gdy twój minimalny cel to iOS 7 lub wyższy, otrzymasz ostrzeżenie kompilatora o przestarzałych metodach. Tak więc, w iOS 7 i nowszych, po prostu konwertujesz na podstawowy ciąg 64 za pomocą:i wróć z:
źródło
iOS zawiera wbudowaną obsługę kodowania i dekodowania base64. Jeśli spojrzysz na
resolv.h
to powinieneś zobaczyć dwie funkcjeb64_ntop
ib64_pton
. Biblioteka Square SocketRocket stanowi rozsądny przykład użycia tych funkcji z celu-c.Funkcje te są dość dobrze przetestowane i niezawodne - w przeciwieństwie do wielu implementacji, które można znaleźć w losowych publikacjach internetowych. Nie zapomnij o linkowaniu przeciwko
libresolv.dylib
.źródło
Ponieważ wydaje się, że jest to hit Google numer jeden w kodowaniu base64 i iPhone, chciałem podzielić się swoim doświadczeniem z powyższym fragmentem kodu.
Działa, ale jest bardzo wolny. Test porównawczy na losowym obrazie (0,4 MB) trwał 37 sekund w przypadku natywnego telefonu iPhone. Głównym powodem jest prawdopodobnie cała magia OOP - pojedyncze znaki NSStrings itp., Które są automatycznie wydawane dopiero po zakończeniu kodowania.
Inna sugestia opublikowana tutaj (ab) korzysta z biblioteki openssl, która również wydaje się przesadna.
Poniższy kod zajmuje 70 ms - to 500-krotne przyspieszenie. Dotyczy to tylko kodowania base64 (dekodowanie nastąpi, gdy tylko go napotkam)
Pominąłem wycinanie linii, ponieważ go nie potrzebowałem, ale dodanie tego jest banalne.
Dla tych, którzy są zainteresowani optymalizacją: celem jest zminimalizowanie tego, co dzieje się w głównej pętli. Dlatego cała logika zajmująca się ostatnimi 3 bajtami jest przetwarzana poza pętlą.
Spróbuj także pracować na danych w miejscu, bez dodatkowego kopiowania do / z buforów. I zredukuj dowolną arytmetykę do absolutnego minimum.
Zauważ, że bity, które są zebrane razem w celu wyszukania wpisu w tabeli, nie nakładałyby się, gdy miały być uporządkowane razem bez przesuwania. Istotnym ulepszeniem może być zatem użycie 4 oddzielnych 256-bajtowych tabel odnośników i wyeliminowanie przesunięć, takich jak to:
Oczywiście możesz pójść o wiele dalej, ale nie jest to tutaj możliwe.
źródło
W doskonałej poprawie mvds występują dwa problemy. Zmień kod na ten:
źródło
Lepsze rozwiązanie:
W NSData jest wbudowana funkcja
źródło
Cieszę się, że ludziom się to podobało. Muszę przyznać, że gra końcowa była trochę wadliwa. Oprócz prawidłowego ustawienia inp = 0 powinieneś także zwiększyć rozmiar tmpbuf do 3, np
lub pomiń orring surowego [inp + 2]; jeśli mielibyśmy surowy [inp + 2]! = 0 dla tej części, nadal bylibyśmy w pętli oczywiście ...
Tak czy inaczej działa, możesz dla zachowania przejrzystości zatrzymać ostatni blok wyszukiwania tabeli identyczny z blokiem w pętli. W ostatecznej wersji, której użyłem, zrobiłem
Aby dodać ==
Przepraszam, że nie sprawdziłem RFC i innych rzeczy, powinienem był wykonać lepszą robotę!
źródło
W iOS8 i nowszych
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
wersjach NSDataźródło
źródło
Aby uzyskać aktualizację w celu użycia
NSData (NSDataBase64Encoding)
metod kategorii w iOS7, zobacz moją odpowiedź tutaj: https://stackoverflow.com/a/18927627/1602729źródło
Oto kompaktowa wersja Objective-C jako kategoria na NSData. Trochę myślenia o ...
W razie potrzeby można dodać dopełnienie, rozszerzając zakres „byt” i dodając „dest” znakami (2-byt) „=” przed powrotem.
Kategorię można następnie dodać do NSString, a zatem:
źródło
iOS ma wbudowane metody kodowania i dekodowania Base64 (bez użycia libresolv) od iOS 4. Zostało to jednak zadeklarowane tylko w zestawie SDK dla iOS 7. Dokumentacja Apple mówi, że możesz jej użyć, gdy celujesz w iOS 4 i wyżej.
źródło
Oto przykład przekonwertowania obiektu NSData na Base 64. Pokazuje także, jak przejść w drugą stronę (dekodować obiekt NSData zakodowany w base 64):
źródło
w iOS 7
źródło
Zrobiłem to przy użyciu następującej klasy ..
Podczas połączenia telefonicznego
Otóż to...
źródło
Myślę, że to będzie pomocne
}
źródło
Pobierz Base64
Wykonaj następujący kod, aby przekonwertować obraz na base64
źródło
Zgodnie z twoim wymaganiem stworzyłem przykładową wersję demo przy użyciu Swift 4, w której możesz zakodować / zdekodować ciąg i obraz zgodnie z wymaganiami.
Dodałem również przykładowe metody odpowiednich operacji.
źródło