Comment convertir NSData
en base64
. J'ai NSData
et je veux convertir en base64
comment faire?
Réponses
Trop de publicités?ÉDITER
Depuis OS X 10.9 / iOS 7, cela est intégré dans les frameworks.
Voir -[NSData base64EncodedDataWithOptions:]
Avant iOS7 / OS X 10.9:
Matt Gallagher a écrit un article sur ce même sujet. En bas, il donne un lien vers son code intégrable pour iPhone.
Sur le mac, vous pouvez utiliser la bibliothèque OpenSSL, sur l'iPhone, il écrit son propre impl.
//from: http://cocoadev.com/BaseSixtyFour
+ (NSString*)base64forData:(NSData*)theData {
const uint8_t* input = (const uint8_t*)[theData bytes];
NSInteger length = [theData length];
static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
uint8_t* output = (uint8_t*)data.mutableBytes;
NSInteger i;
for (i=0; i < length; i += 3) {
NSInteger value = 0;
NSInteger j;
for (j = i; j < (i + 3); j++) {
value <<= 8;
if (j < length) {
value |= (0xFF & input[j]);
}
}
NSInteger theIndex = (i / 3) * 4;
output[theIndex + 0] = table[(value >> 18) & 0x3F];
output[theIndex + 1] = table[(value >> 12) & 0x3F];
output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '=';
output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '=';
}
return [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
}
En tant que mise à jour, le SDK iOS7 a une catégorie sur NSData (NSDataBase64Encoding)
avec des méthodes
-[NSData base64EncodedStringWithOptions:]
-[NSData initWithBase64EncodedString:options:]
-[NSData initWithBase64EncodedData:options:]
-[NSData base64EncodedDataWithOptions:]
Devrait éviter d'avoir à lancer votre propre méthode de catégorie
Code de bibliothèque Google super facile à insérer ici.
Utilisez simplement +rfc4648Base64StringEncoding
pour obtenir une instance, puis utilisez les fonctions encode
/ decode
.
C'est une belle chose. (N'oubliez pas de récupérer le fichier d'en-tête et l'en-tête GTMDefines.h
à la racine, cependant.)
Ce n'est pas facile. Comme il n'y a pas de prise en charge intégrée de ce en c ou en obj-c. Voici ce que Im faire (Qui est en fait d'avoir la CL de le faire pour moi):
- (NSString *)_base64Encoding:(NSString *) str
{
NSTask *task = [[[NSTask alloc] init] autorelease];
NSPipe *inPipe = [NSPipe pipe], *outPipe = [NSPipe pipe];
NSFileHandle *inHandle = [inPipe fileHandleForWriting], *outHandle = [outPipe fileHandleForReading];
NSData *outData = nil;
[task setLaunchPath:@"/usr/bin/openssl"];
[task setArguments:[NSArray arrayWithObjects:@"base64", @"-e", nil]];
[task setStandardInput:inPipe];
[task setStandardOutput:outPipe];
[task setStandardError:outPipe];
[task launch];
[inHandle writeData:[str dataUsingEncoding: NSASCIIStringEncoding]];
[inHandle closeFile];
[task waitUntilExit];
outData = [outHandle readDataToEndOfFile];
if (outData)
{
NSString *base64 = [[[NSString alloc] initWithData:outData encoding:NSUTF8StringEncoding] autorelease];
if (base64)
return base64;
}
return nil;
}
Et vous l'utiliser comme ceci:
NSString *b64str = [strToConvert _base64Encoding:strToConvert];
Et ce n'est pas mon code, je l'ai trouvé ici: http://www.cocoadev.com/index.pl?BaseSixtyFour et il fonctionne très bien. Vous pouvez toujours en faire un +() la méthode.
Oh, et pour obtenir votre NSData à un NSString pour cette méthode:
NSString *str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];