Je voudrais faire de l' base64
encodage et du décodage, mais je n'ai trouvé aucun support de l'iPhone SDK
. Comment puis-je base64
encoder et décoder avec ou sans bibliothèque?
ios
objective-c
base64
BlueDolphin
la source
la source
Réponses:
Ce cas est un bon usage pour Objective C catégories .
Pour l'encodage Base64:
Pour le décodage Base64:
la source
Une implémentation vraiment, vraiment rapide qui a été portée (et modifiée / améliorée) de la bibliothèque PHP Core en code Objective-C natif est disponible dans la classe QSStrings de la bibliothèque QSUtilities . J'ai fait un test rapide: un fichier image (JPEG) de 5,3 Mo a pris <50 ms pour encoder et environ 140 ms pour décoder.
Le code de la bibliothèque entière (y compris les méthodes Base64) est disponible sur GitHub .
Ou bien, si vous voulez que le code ne concerne que les méthodes Base64, je l'ai posté ici:
Tout d'abord, vous avez besoin des tables de mappage:
Pour encoder:
Pour décoder:
la source
strResult
dans l'encodeur semble avoir fui; il a juste besoin d'unfree()
à la fin (avant de revenir mais aprèsNSString stringWithCString
)encodeBase64WithData:
méthode, le premier paramètre de l'appelcalloc()
n'a-t-il pas besoin d'être incrémenté de 1 pour tenir compte du terminateur nul ('\0'
) que vous ajoutez à la fin?Historiquement, nous vous aurions dirigé vers l'une des nombreuses bibliothèques de base 64 tierces (comme indiqué dans les autres réponses) pour la conversion des données binaires en chaîne de base 64 (et inversement), mais iOS 7 dispose désormais d'un codage de base 64 natif (et expose les méthodes iOS 4 précédemment privées, au cas où vous auriez besoin de prendre en charge des versions antérieures d'iOS).
Ainsi, pour convertir
NSData
enNSString
représentation en base 64, vous pouvez utiliserbase64EncodedStringWithOptions
. Si vous devez également prendre en charge les versions iOS antérieures à 7.0, vous pouvez:Et pour reconvertir la base 64
NSString
,NSData
vous pouvez l'utiliserinitWithBase64EncodedString
. De même, si vous devez prendre en charge les versions iOS antérieures à 7.0, vous pouvez faire:De toute évidence, si vous n'avez pas besoin de compatibilité descendante avec les versions iOS antérieures à 7.0, c'est encore plus facile, utilisez simplement
base64EncodedStringWithOptions
ouinitWithBase64EncodedString
, respectivement, et ne vous embêtez pas avec la vérification de l'exécution pour les versions iOS antérieures. En fait, si vous utilisez le code ci-dessus lorsque votre cible minimale est iOS 7 ou supérieur, vous obtiendrez en fait un avertissement du compilateur concernant les méthodes obsolètes. Donc, dans iOS 7 et supérieur, vous convertiriez simplement en chaîne de base 64 avec:et encore avec:
la source
iOS inclut une prise en charge intégrée pour l'encodage et le décodage base64. Si vous regardez,
resolv.h
vous devriez voir les deux fonctionsb64_ntop
etb64_pton
. The Square SocketRocket bibliothèque fournit un exemple raisonnable de la façon d'utiliser ces fonctions à partir de objective-c.Ces fonctions sont assez bien testées et fiables - contrairement à la plupart des implémentations que vous pouvez trouver dans des publications Internet aléatoires. N'oubliez pas de créer un lien contre
libresolv.dylib
.la source
Comme cela semble être le numéro un de Google sur l'encodage base64 et l'iphone, j'ai eu envie de partager mon expérience avec l'extrait de code ci-dessus.
Cela fonctionne, mais c'est extrêmement lent. Un benchmark sur une image aléatoire (0,4 Mo) a pris 37 secondes sur l'iphone natif. La raison principale est probablement toute la magie OOP - NSStrings à caractère unique, etc., qui ne sont libérés automatiquement qu'après l'encodage.
Une autre suggestion publiée ici (ab) utilise la bibliothèque openssl, qui semble également exagérée.
Le code ci-dessous prend 70 ms - c'est une accélération de 500 fois. Cela ne fait que l'encodage base64 (le décodage suivra dès que je le rencontrerai)
J'ai laissé de côté la coupe car je n'en avais pas besoin, mais c'est trivial à ajouter.
Pour ceux qui souhaitent optimiser: l'objectif est de minimiser ce qui se passe dans la boucle principale. Par conséquent, toute logique pour traiter les 3 derniers octets est traitée en dehors de la boucle.
Essayez également de travailler sur les données sur place, sans copie supplémentaire vers / depuis les tampons. Et réduisez toute arithmétique au strict minimum.
Observez que les bits rassemblés pour rechercher une entrée dans le tableau ne se chevaucheraient pas lorsqu'ils devaient être redirigés sans décalage. Une amélioration majeure pourrait donc être d'utiliser 4 tables de recherche distinctes de 256 octets et d'éliminer les décalages, comme ceci:
Bien sûr, vous pourriez aller beaucoup plus loin, mais cela dépasse le cadre ici.
la source
Dans l'excellente amélioration de mvds, il y a deux problèmes. Changez le code en ceci:
la source
Meilleure solution:
Il y a une fonction intégrée dans NSData
la source
Heureux que les gens aient aimé. La fin de partie était un peu défectueuse, je dois l'admettre. En plus de définir correctement inp = 0, vous devez également augmenter la taille de tmpbuf à 3, comme
ou omettre l'orring de raw [inp + 2]; si nous avions un [inp + 2] brut! = 0 pour ce morceau nous serions toujours dans la boucle bien sûr ...
Dans les deux cas, vous pouvez envisager de conserver le bloc de recherche de table final identique à celui de la boucle pour plus de clarté. Dans la version finale que j'ai utilisée, je l'ai fait
Pour ajouter le ==
Désolé, je n'ai pas vérifié les RFC et tout ça, j'aurais dû faire un meilleur travail!
la source
Sous iOS8 et utilisation ultérieure
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options
de NSDatala source
la source
Pour une mise à jour pour utiliser les
NSData (NSDataBase64Encoding)
méthodes de catégorie dans iOS7, voir ma réponse ici: https://stackoverflow.com/a/18927627/1602729la source
Voici une version Objective-C compacte en tant que catégorie sur NSData. Il faut réfléchir à ...
Le remplissage peut être ajouté si nécessaire en élargissant la portée de 'byt' et en ajoutant 'dest' avec (2-byt) caractères "=" avant de revenir.
Une catégorie peut ensuite être ajoutée à NSString, ainsi:
la source
iOS a intégré des méthodes d'encodage et de décodage Base64 (sans utiliser libresolv) depuis iOS 4. Cependant, il n'a été déclaré que dans le SDK iOS 7. La documentation Apple indique que vous pouvez l'utiliser pour cibler iOS 4 et supérieur.
la source
Voici un exemple pour convertir un objet NSData en Base 64. Il montre également comment procéder dans l'autre sens (décoder un objet NSData encodé en base 64):
la source
dans iOS 7
la source
Je l'ai fait en utilisant la classe suivante ..
Pendant l'appel appel
C'est tout...
la source
Je pense que ce sera utile
}
la source
Télécharger Base64
Faites le code suivant pour convertir une image en base64
la source
Selon vos besoins, j'ai créé un exemple de démonstration à l'aide de Swift 4 dans lequel vous pouvez encoder / décoder des chaînes et des images selon vos besoins.
J'ai également ajouté des exemples de méthodes d'opérations pertinentes.
la source