Ich würde gerne base64
codieren und decodieren, aber ich konnte keine Unterstützung vom iPhone finden SDK
. Wie kann ich base64
mit oder ohne Bibliothek codieren und decodieren?
ios
objective-c
base64
BlueDolphin
quelle
quelle
Antworten:
Dies ist ein guter Anwendungsfall für Ziel-C- Kategorien .
Für die Base64-Codierung:
Für die Base64-Decodierung:
quelle
Eine wirklich sehr schnelle Implementierung, die aus der PHP Core-Bibliothek in nativen Objective-C-Code portiert (und geändert / verbessert) wurde, ist in der QSStrings-Klasse aus der QSUtilities-Bibliothek verfügbar . Ich habe einen schnellen Benchmark durchgeführt: Die Codierung einer 5,3-MB-Bilddatei (JPEG) dauerte <50 ms und die Dekodierung etwa 140 ms.
Der Code für die gesamte Bibliothek (einschließlich der Base64-Methoden) ist auf GitHub verfügbar .
Oder alternativ, wenn Sie möchten, dass der Code nur die Base64-Methoden selbst enthält, habe ich ihn hier veröffentlicht:
Zunächst benötigen Sie die Zuordnungstabellen:
So codieren Sie:
Zu dekodieren:
quelle
strResult
im Encoder zugewiesene Speicher scheint durchgesickert zu sein; es braucht nur einfree()
am Ende (vor der Rückkehr, aber danachNSString stringWithCString
)encodeBase64WithData:
Methode nicht der erste Parameter im Aufrufcalloc()
um 1 erhöht werden, um den Nullterminator ('\0'
) zu berücksichtigen, den Sie am Ende hinzufügen?In der Vergangenheit hätten wir Sie an eine der vielen Basis-64-Bibliotheken von Drittanbietern verwiesen (wie in den anderen Antworten erläutert), um von Binärdaten in Basis-64-Zeichenfolgen (und zurück) zu konvertieren, aber iOS 7 verfügt jetzt über eine native Basis-64-Codierung (und macht die zuvor privaten iOS 4-Methoden verfügbar (falls Sie frühere Versionen von iOS unterstützen müssen).
Sie können also eine Konvertierung
NSData
in eineNSString
Basis-64-Darstellung verwendenbase64EncodedStringWithOptions
. Wenn Sie auch iOS-Versionen vor 7.0 unterstützen müssen, können Sie Folgendes tun:Und um die Basis 64
NSString
wieder zu konvertieren , könnenNSData
Sie verwendeninitWithBase64EncodedString
. Wenn Sie iOS-Versionen vor 7.0 unterstützen müssen, können Sie Folgendes tun:Wenn Sie vor 7.0 keine Abwärtskompatibilität mit iOS-Versionen benötigen, ist es natürlich noch einfacher, einfach
base64EncodedStringWithOptions
bzw. zuinitWithBase64EncodedString
verwenden und sich nicht um die Laufzeitprüfung für frühere iOS-Versionen zu kümmern. Wenn Sie den obigen Code verwenden, wenn Ihr Mindestziel iOS 7 oder höher ist, erhalten Sie tatsächlich eine Compiler-Warnung zu den veralteten Methoden. In iOS 7 und höher konvertieren Sie also einfach in eine Basis-64-Zeichenfolge mit:und wieder zurück mit:
quelle
iOS bietet integrierte Unterstützung für die Base64-Codierung und -Decodierung. Wenn Sie sich ansehen
resolv.h
, sollten Sie die beiden Funktionenb64_ntop
und sehenb64_pton
. Die Square SocketRocket- Bibliothek bietet ein vernünftiges Beispiel für die Verwendung dieser Funktionen von Objective-C.Diese Funktionen sind ziemlich gut getestet und zuverlässig - im Gegensatz zu vielen Implementierungen, die Sie in zufälligen Internet-Postings finden können. Vergiss nicht, gegen zu verlinken
libresolv.dylib
.quelle
Da dies der Google-Hit Nummer eins bei Base64-Codierung und iPhone zu sein scheint, wollte ich meine Erfahrungen mit dem obigen Code-Snippet teilen.
Es funktioniert, aber es ist extrem langsam. Ein Benchmark für ein zufälliges Bild (0,4 MB) dauerte auf dem nativen iPhone 37 Sekunden. Der Hauptgrund ist wahrscheinlich die gesamte OOP-Magie - Einzelzeichen-NSStrings usw., die erst nach Abschluss der Codierung automatisch freigegeben werden.
Ein anderer Vorschlag, der hier (ab) veröffentlicht wurde, verwendet die openssl-Bibliothek, die sich ebenfalls wie ein Overkill anfühlt.
Der folgende Code dauert 70 ms - das ist eine 500-fache Beschleunigung. Dies führt nur eine Base64-Codierung durch (die Decodierung erfolgt, sobald ich darauf stoße).
Ich habe das Linienschneiden weggelassen, da ich es nicht brauchte, aber es ist trivial hinzuzufügen.
Für diejenigen, die an einer Optimierung interessiert sind: Ziel ist es, das Geschehen in der Hauptschleife zu minimieren. Daher wird die gesamte Logik zur Behandlung der letzten 3 Bytes außerhalb der Schleife behandelt.
Versuchen Sie außerdem, Daten direkt zu bearbeiten, ohne sie zusätzlich in / aus den Puffern zu kopieren. Und reduzieren Sie jede Arithmetik auf das Nötigste.
Beachten Sie, dass sich die Bits, die zusammengesetzt werden, um einen Eintrag in der Tabelle nachzuschlagen, nicht überlappen würden, wenn sie ohne Verschiebung zusammengefügt würden. Eine wesentliche Verbesserung könnte daher darin bestehen, 4 separate 256-Byte-Nachschlagetabellen zu verwenden und die Verschiebungen wie folgt zu beseitigen:
Natürlich könnte man noch viel weiter gehen, aber das geht hier über den Rahmen hinaus.
quelle
Bei der hervorragenden Verbesserung von mvds gibt es zwei Probleme. Ändern Sie den Code in diesen:
quelle
Bessere Lösung:
In NSData ist eine Funktion integriert
quelle
Ich bin froh, dass es den Leuten gefallen hat. Das Endspiel war ein wenig fehlerhaft, muss ich zugeben. Neben der richtigen Einstellung von inp = 0 sollten Sie entweder auch die Größe von tmpbuf auf 3 erhöhen, z
oder lassen Sie den rohen Orring weg [inp + 2]; Wenn wir für dieses Stück ein rohes [inp + 2]! = 0 hätten, wären wir natürlich immer noch auf dem Laufenden ...
In beiden Fällen können Sie aus Gründen der Übersichtlichkeit in Betracht ziehen, den Final Table-Suchblock mit dem in der Schleife identischen Block identisch zu halten. In der endgültigen Version, die ich verwendet habe, habe ich getan
Um das == hinzuzufügen
Tut mir leid, dass ich RFCs und andere Dinge nicht überprüft habe, hätte einen besseren Job machen sollen!
quelle
Unter iOS8 und höher Verwendung
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
von NSDataquelle
quelle
Ein Update zur Verwendung der
NSData (NSDataBase64Encoding)
Kategoriemethoden in iOS7 finden Sie in meiner Antwort hier: https://stackoverflow.com/a/18927627/1602729quelle
Hier ist eine kompakte Objective-C-Version als Kategorie für NSData. Man muss nachdenken ...
Bei Bedarf kann eine Auffüllung hinzugefügt werden, indem der Bereich von 'byt' erweitert und 'dest' vor der Rückkehr mit (2-byt) "=" Zeichen angehängt wird.
Eine Kategorie kann dann zu NSString hinzugefügt werden, also:
quelle
iOS verfügt seit iOS 4 über integrierte Base64-Codierungs- und -Decodierungsmethoden (ohne Verwendung von Libresolv). Diese wurden jedoch nur im iOS 7 SDK deklariert. In der Apple-Dokumentation heißt es, dass Sie es für iOS 4 und höher verwenden können.
quelle
Hier ist ein Beispiel zum Konvertieren eines NSData-Objekts in Base 64. Es zeigt auch, wie Sie in die andere Richtung gehen (ein Base 64-codiertes NSData-Objekt dekodieren):
quelle
in iOS 7
quelle
Ich habe es mit der folgenden Klasse gemacht ..
Während des Anrufs
Das ist es...
quelle
Ich denke, das wird hilfreich sein
}}
quelle
Laden Sie Base64 herunter
Führen Sie den folgenden Code aus, um ein Bild in base64 zu konvertieren
quelle
Gemäß Ihrer Anforderung habe ich mit Swift 4 eine Beispieldemo erstellt, in der Sie Zeichenfolge und Bild gemäß Ihrer Anforderung codieren / decodieren können.
Ich habe auch Beispielmethoden für relevante Operationen hinzugefügt.
quelle