Comment dois-je faire de l'encodage base64 sur iOS?
J'aimerais faire base64
d'encodage et de décodage, mais je ne pouvais pas trouver tout le soutien de l'iPhone SDK
. Comment puis-je faire base64
d'encodage et de décodage avec ou sans bibliothèque?
- Il y a un bel exemple de code en bas de ce post. Très autonome... BaseSixtyFour
- le lien est mort.
Vous devez vous connecter pour publier un commentaire.
C'est un bon cas d'utilisation pour Objectif C catégories.
Pour l'encodage Base64:
Pour un décodage Base64:
put
n'est pas déclarée dansbase64StringFromData
, parmi d'autres choses...base64DataFromString:
xcode analyseur dit il y a des problèmes avec les deux lignes avecinbuf[n] &
. Il est dit "L'opérande de gauche de" & "est une valeur d'ordures". Je ne vois pas le problème avec ce code, et donc je suis enclin à penser que c'est un analyseur de bug, mais je me demande si quelqu'un voit un problème dans le code.Vraiment, vraiment rapide mise en œuvre qui a été porté (et modifié/amélioré) à partir du PHP de Base de la bibliothèque en natif (Objective-C code est disponible dans le QSStrings Classe de la QSUtilities Bibliothèque. J'ai fait une rapide référence: 5.3 MB image (JPEG) fichier pris < 50ms à coder, et sur 140ms à décoder.
Le code pour l'ensemble de la bibliothèque (y compris le Base64 Méthodes) sont disponibles sur GitHub.
Ou sinon, si vous voulez le code de juste le Base64 méthodes elles-mêmes, j'ai posté ici:
Tout d'abord, vous avez besoin de les tables de correspondance:
À Encoder:
À Décoder:
strResult
dans le codeur semble être une fuite, il a juste besoin d'unfree()
à la fin (avant de revenir, mais aprèsNSString stringWithCString
)encodeBase64WithData:
méthode, n'est-ce pas le premier paramètre de l'appel àcalloc()
doivent être incrémenté de 1 pour tenir compte de la terminateur null ('\0'
) vous ajoutez à la fin?NSData* objData = [NSData dataWithBytesNoCopy:objResult length:j freeWhenDone:YES]
Historiquement, nous aurait dirigé vous vers l'un des nombreux tiers de la base de 64 bibliothèques (comme indiqué dans les autres réponses) pour la conversion de données binaires à base 64 de la chaîne (et de retour), mais iOS 7 a maintenant natif de codage en base 64 (et expose précédemment privé iOS 4 méthodes, dans le cas où vous avez besoin de support des versions antérieures d'iOS).
Ainsi, pour convertir
NSData
àNSString
base 64 représentation vous pouvez utiliserbase64EncodedStringWithOptions
. Si vous avez pour soutenir iOS versions antérieures à la version 7.0, vous pouvez le faire:Et à convertir en base 64
NSString
retour àNSData
vous pouvez utiliserinitWithBase64EncodedString
. De même, si vous avez besoin de soutien iOS versions antérieures à la version 7.0, vous pouvez le faire:Évidemment, si vous n'avez pas besoin de compatibilité descendante avec les versions d'iOS antérieures à la version 7.0, il est encore plus facile, il suffit d'utiliser
base64EncodedStringWithOptions
ouinitWithBase64EncodedString
, respectivement, et ne vous embêtez pas avec le moment de l'exécution de vérifier pour d'anciennes versions iOS. En fait, si vous utilisez le code ci-dessus lorsque votre objectif minimum est de iOS 7 ou plus, vous recevrez un avertissement du compilateur sur les méthodes obsolètes. Donc, dans iOS 7 et plus, il vous suffit de convertir en base 64 chaîne avec:et de retour à nouveau avec:
iOS comprend un support intégré pour les base64 d'encodage et de décodage. Si vous regardez
resolv.h
vous devriez voir les deux fonctionsb64_ntop
etb64_pton
. La Place SocketRocket bibliothèque génère un exemple d'utilisation de ces fonctions à partir d'objective-c.Ces fonctions sont assez bien testé et fiable - à la différence de la plupart des implémentations vous pouvez trouver aléatoire des messages envoyés sur internet.
N'oubliez pas de lien contre
libresolv.dylib
.Depuis ce qui semble être le numéro un de google a frappé sur le codage base64 et iphone, j'ai eu envie de partager mon expérience avec l'extrait de code ci-dessus.
Cela fonctionne, mais il est extrêmement lent. Une référence sur une image aléatoire (0.4 mb) a pris de 37 secondes sur native de l'iphone. La raison principale est probablement tous de la programmation orientée objet magique - char NSStrings etc, qui ne sont autoreleased après le codage est fait.
Une autre suggestion posté ici (ab)utilise la bibliothèque openssl, qui se sent comme overkill ainsi.
Le code ci-dessous prend 70 ms - qui est 500 fois plus rapide. Cette seulement le codage base64 (décodage suivront dès que je rencontre c')
J'ai quitté la ligne de coupe, puisque je n'ai pas besoin de cela, mais il est facile d'ajouter.
Pour ceux qui sont intéressés par l'optimisation: l'objectif est de minimiser ce qui se passe dans la boucle principale. Donc en toute logique de traiter avec les 3 derniers octets est traitée en dehors de la boucle.
Aussi, essayez de travailler sur des données en place, sans autre copie vers/depuis les tampons. Et de réduire l'arithmétique au strict minimum.
Observer que les bits qui sont mis ensemble pour rechercher une entrée dans la table, se chevauchent pas quand ils devaient être orred ensemble sans se déplacer. Une amélioration majeure pourrait donc être d'utiliser 4 256 octets de tables de recherche et d'éliminer les décalages, comme ceci:
Bien sûr, vous pourriez prendre un ensemble beaucoup plus loin, mais c'est au-delà de la portée ici.
Dans mvds est excellente amélioration, il y a deux problèmes. Modifier le code de cette fonction:
Meilleure solution :
Il y a une fonction intégrée dans NSData
Heureux les gens l'ont aimé. La fin du jeu était un peu imparfait je dois l'avouer. D'ailleurs, à juste titre, paramètre inp=0 vous devez également augmenter tmpbuf de la taille de 3, comme
ou de laisser le orring de raw[inp+2]; si nous aurions un raw[inp+2] != 0 pour ce morceau nous serions encore dans la boucle de cours...
Une ou l'autre fonctionne, vous pourriez envisager de garder le final de la consultation d'une table de bloc identique à celui de la boucle pour plus de clarté. Dans la version finale que j'ai utilisé, je n'ai
Ajouter l' ==
Désolé je n'ai pas vérifier RFC), et d'autres choses, il devrait y avoir fait un meilleur travail!
Sous iOS8 et de les utiliser plus tard
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
de NSDataPour une mise à jour pour utiliser le
NSData (NSDataBase64Encoding)
catégorie de méthodes dans iOS7 voir ma réponse ici: https://stackoverflow.com/a/18927627/1602729Voici un compact Objective-C version de la Catégorie sur NSData. Il faut un peu de réflexion sur...
Le rembourrage peut être ajouté si nécessaire en faisant de la notion de "byt' plus large et en ajoutant 'dest' avec (2-byt) "=" caractères avant de revenir.
Une Catégorie peut ensuite être ajouté à NSString, donc:
iOS a construit-dans le codage Base64 et méthodes de décodage (sans l'aide de libresolv) depuis iOS 4. Cependant, il n'est déclarée dans l'iOS 7 SDK. La documentation d'Apple indique que vous pouvez utiliser lorsque vous ciblez iOS 4 et au-dessus.
Voici un exemple pour convertir un NSData objet en Base 64. Il montre également comment aller dans l'autre sens (décoder une base de 64 codé NSData objet):
dans iOS 7
Je l'ai fait à l'aide de la classe suivante..
Tout en appelant appel
Que c'est...
Je Pense que Ce sera utile
}
Télécharger Base64
Ne code suivant pour convertir une image en base64
Selon vos besoins, j'ai créé un exemple de démonstration utilisant Swift 4 dans lequel vous pouvez encoder/décoder la chaîne et de l'image selon vos besoins.
J'ai également ajouté les exemples de méthodes d'opérations pertinentes.