base 64 encoding objective-c - ios

I am trying to convert copied images on the iOS pasteboard from a string to an image. 90% of the time this works under the scheme i have with URL's. However 1/10 times the image is not a url but is of what seems to be a base 64 encoding. The string looks like this.
data:image/jpeg;base64,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
Now I use the following code to recognize its base64 based off a post I found.
- (BOOL)isBase64Data :(NSString *)input{
input=[[input componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:#""];
if ([input length] % 4 == 0) {
static NSCharacterSet *invertedBase64CharacterSet = nil;
if (invertedBase64CharacterSet == nil) {
invertedBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:#"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="]invertedSet];
}
return [input rangeOfCharacterFromSet:invertedBase64CharacterSet options:NSLiteralSearch].location == NSNotFound;
}
return NO;
}
However it always returns false. Does this string I show need some trimming in some way? I find the length of the string to be 8391 therefore modulo 4==0 is never invoked.

/9j/4AAQSkZJ is a typical beginning of JPEG data, converted to hex as FFD8FFE00010+JFIF. If you want to convert it to an image, you need to point the converter to the point AFTER the data:image/jpeg;base64, text.
I think you can do something like this:
NSData *base64 = [yourData subdataWithRange:NSMakeRange(24, yourData.length-24)];
NSData *imgData = [[NSData alloc] initWithBase64EncodedData:base64 options:0];
UIImage *img = [UIImage imageWithData:imgData];
I might be wrong with the exact implementation but this is the general idea...

Related

Get unicode chars from webservice and display them in ios app

I need some help:
i get from WebService only a part from the uunicode value, and after this I append the prefix \u to finish the value. The .ttf is good, i tested with some hardcoded values.
NSString *cuvant = [[self.catData objectAtIndex:indexPath.row]objectAtIndex:9]; //Get data
//apend prefix (double \ to escape the \u command)
cuvant = [NSString stringWithFormat:#"\\u%#",cuvant];
// cell.catChar.text = [NSString stringWithUTF8String:"\ue674"]; --->this works very well
cell.catChar.text = [NSString stringWithUTF8String:[cuvant UTF8String]]; //---> this doesn't work
i searched the documentation, and other sites but i didn't found nothing usefull, all the hints are with hardcoded data... i need tot take the codes dinamically
Thanks!
All you need is just to feed this unicoded string as data first. So make a C-String then
NSData *dataFromUnicodedString = [NSData dataWithBytes:yourCUnicodedString length:strlen(yourCUnicodedString)];
and afterwards the resulting string will be
NSString *unicodedString = [[NSString alloc] initWithData:dataFromUnicodedString encoding:NSUTF8StringEncoding];

Compare NSData with byte sequence?

Note: in other questions they compare a value stored in NSData objects, not its bytes.
I want to perform something like this:
NSData *d = ...;
if (d == "fff1") {
...
}
The only solution I have found:
NSData *d = ...;
NSString *str = [NSString withFormat:#"%#", d];
if ([str isEqualToString:#"<fff1>"] {
...
}
But I don't like that I need to add extra surrounding backets in comparison. Are there better solutions?
For purpose of comparing raw data you use memcmp:
NSData *dataA;
void *someBuffer;
if(memcmp([dataA bytes], someBuffer, dataA.length) == 0) ; //they are the same
Note you should watch that length is not too large for any of the buffers.
EDIT: added NSData procedure:
Or better yet you could convert your string to NSData and do the comparison on the NSData:
NSData *d = ...;
if([d isEqualToData:[NSData dataWithBytes:"fff1" length:sizeof("fff1")]]) {
}

Save and load image from SQL database

I'm trying to display an image from my Database.
This part works nicely.
I save the image in the DB like this :
UIImage *resizedImg = [Generics scaleImage:self.photo.image toResolution:self.photo.frame.size.width and:self.photo.frame.size.height];
NSData *imgData = UIImageJPEGRepresentation(resizedImg, 0.9);
NSString *stringDataImage = [NSString stringWithFormat:#"%#",imgData];
[dict setObject:stringDataImage for key#"image"];
// POST Request to save the image in DB ...
Now when I try to load the image and set it into my UIImageView I do this way :
NSData *data = [[[MyUser sharedUser] picture] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data]];
Or
NSData *data = [[[MyUser sharedUser] picture] dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
self.imageView.image = [UIImage withData:data];
But this doesn't work.
data is not equal to imgData, I think it's the encoding but I can find the good one.
And [UIImage withData:data] return nil;
Can you help me?
EDIT :
Convert and save
UIImage *resizedImg = [Generics scaleImage:self.photo.image toResolution:self.photo.frame.size.width and:self.photo.frame.size.height];
NSData *imgData = UIImageJPEGRepresentation(resizedImg, 0.9);
[dict setObject:[imgData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength] forKey:#"image"];
Load the image
NSData *data = [[NSData alloc] initWithBase64EncodedData:[[MyUser sharedUser] picture] options:kNilOptions];
NSLog(#"%#", data);
self.image.image = [UIImage imageWithData:data];
You are converting the NSData to a string and saving that to your database. Two issues:
Your choice of using the stringWithFormat construct is an inefficient string representation of your data (resulting in string representation that is roughly twice the size). You probably want to use base64 (for which the string representation is only 33% larger).
You are saving your string representation, but never converting it back to binary format after retrieving it. You could write a routine to do this, but it's better to just use established base64 formats.
If you want to save the image as a string in your database, you should use base64. Historically we would have directed you to one of the many third party libraries (see How do I do base64 encoding on iphone-sdk?) for converting from binary data to base64 string (and back), or, iOS 7 now has native base 64 encoding (and exposes the private iOS 4 method, in case you need to support earlier versions of iOS).
Thus to convert NSData to NSString base64 representation:
NSString *string;
if ([data respondsToSelector:#selector(base64EncodedStringWithOptions:)]) {
string = [data base64EncodedStringWithOptions:kNilOptions]; // iOS 7+
} else {
string = [data base64Encoding]; // pre iOS7
}
And to convert base64 string back to NSData:
NSData *data;
if ([NSData instancesRespondToSelector:#selector(initWithBase64EncodedString:options:)]) {
data = [[NSData alloc] initWithBase64EncodedString:string options:kNilOptions]; // iOS 7+
} else {
data = [[NSData alloc] initWithBase64Encoding:string]; // pre iOS7
}
If you really want to turn binary data into a string you should be using base64 encoding. Luckily for you, NSData now supports Base64 natively
So you could get your string from data with:
NSString *stringDataImage = [imgData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
And you could turn this back into NSData with:
NSData *imgData = [[NSData alloc] initWithBase64EncodedString:stringDataImage options:kNilOptions];

Extract URL of Image From String

I am trying to extract the URL for an image from a string of text. It may be from different websites, and could be any form of image (jpg, png, gif, etc.). What would be a good way to scan the string, find any matching picture extension, and get the graphic from it?
The string may be something like this:
Hello, I hope you like my picture located at http://www.website.com/picture1.png. However, if you don't, I know you'll like this one http://www.website2.org/picture2.jpg.Please refer all comments to http://www.website5.com/
I want to be able to scan the string for ONLY URLs of image files, and make a new string of whatever the first image URL is. So in this string, I could create a new string that only has http://www.website.com/picture1.png
I got from The Link Objective-C - Finding a URL within a string
No need to use RegexKitLite for this, since iOS 4 Apple provide NSDataDetector (a subclass of NSRegularExpression).
You can use it simply like this (source is your string) :
NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray* matches = [detector matchesInString:source options:0 range:NSMakeRange(0, [source length])];
Use below code after later finish with #Anup Kumar
for (NSTextCheckingResult *match in matches) {
NSRange matchRange = [match range];
if ([match resultType] == NSTextCheckingTypeLink) {
NSURL *url = [match URL];
} else if ([match resultType] == NSTextCheckingTypePhoneNumber) {
NSString *phoneNumber = [match phoneNumber];
}
}
Well, to get the extension you can use the NSString method pathExtension, this will result in a string with just the extension, so you will know if it is jpg, gif, png, etc.
NSString* path = #"http://location.com/pictures/image.jpg";
NSString* extension = [path pathExtension];
For your graphic you can use the UIImage imageWithData method, and pass it the output from NSData dataWithContentsOfUrl method, using these methods together will allow you to create a UIImage which you can then display in a UIImageView.
UIImage* image = [UIImage imageWithData:[NSData dataWithContentsOfURL:path]];
Hopefully that is helpful.

Decoding the scanned barcode value to int value

When I scan the barcode and I get some value if it is Equal=2 then I need to display with == and if it is Equal=3 then I need to display with = and if the value is 4 then invalid.
But Scanned Barcode are of integer value -- when decode using NSASCII it is displaying only till value 127 after that it is showing invalid results. Eg: if my Barcode value = 9699 the result value=jem then my added result value=jem= actualstring value=%åasc value id only showing 37
Here is my code:
- (void) readerView:(ZBarReaderView *)view didReadSymbols:(ZBarSymbolSet *)syms fromImage:(UIImage *)img
{
// do something useful with results -- cool thing is that you get access to the image too
for (ZBarSymbol *symbol in syms) {
[resultsBox setText:symbol.data];
if ([resultsBox.text length] == 2) {
addedresult.text = [resultsBox.text stringByAppendingString:#"=="];
} else if ([resultsBox.text length] == 3) {
addedresult.text = [resultsBox.text stringByAppendingString:#"="];
} if ([resultsBox.text length] >= 4) {
addedresult.text = #"Invalid";
}
[Base64 initialize];
NSString *myString = [[NSString alloc]initWithString:addedresult.text];
NSData * data = [Base64 decode:myString];
NSString * actualString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(#"%#",actualString);
labeltext.text= actualString;
int asc = [actualString characterAtIndex:0];
label.text = [NSString stringWithFormat:#"%d", asc];
[actualString release];
break;
}
}
Since someone revived this question's comments, i'll revive this entire post.
You shouldn't go through NSData to create an NSString from something you already have, and you're probably losing something along the way. Go directly to NSString using stringWithFormat. Also, ASCII will come back and byte you later, if you have a choice, use UTF8.
NSString *actualStringUTF8 = [NSString stringWithFormat:#"%#",[addedresult.text urlEncodeUsingEncoding:NSUTF8StringEncoding]];
NSString *actualStringASCII = [NSString stringWithFormat:#"%#",[addedresult.text urlEncodeUsingEncoding:NSUTF8StringEncoding]];
NSLog(#"%#",actualStringUTF8);
NSLog(#"%c",[actualStringUTF8 UTF8String]); //This is a const char*
Secondly, I looked into the SDK and it says symbol.data is already an NSString*. Depending on what you want, you may not need to do anything. If you do end up needing to change encoding, make sure you understand why you need to (one good reason is "the rest of the application uses NS****StringEncoding").
Also make sure you compare strings the correct "Objective-C" way:
[actualString isEqualToString: testString];
NOT actualString == testString;

Resources