Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to convert an NSString to hex values
    primarykey
    data
    text
    <p>I'd like to convert a regular NSString into an NSString with the (what I assume are) ASCII hex values and back.</p> <p>I need to produce the same output that the Java methods below do, but I can't seem to find a way to do it in Objective-C. I've found some examples in C and C++ but I've had a hard time working them into my code.</p> <p>Here are the Java methods I'm trying to reproduce:</p> <pre><code>/** * Encodes the given string by using the hexadecimal representation of its UTF-8 bytes. * * @param s The string to encode. * @return The encoded string. */ public static String utf8HexEncode(String s) { if (s == null) { return null; } byte[] utf8; try { utf8 = s.getBytes(ENCODING_UTF8); } catch (UnsupportedEncodingException x) { throw new RuntimeException(x); } return String.valueOf(Hex.encodeHex(utf8)); } /** * Decodes the given string by using the hexadecimal representation of its UTF-8 bytes. * * @param s The string to decode. * @return The decoded string. * @throws Exception If an error occurs. */ public static String utf8HexDecode(String s) throws Exception { if (s == null) { return null; } return new String(Hex.decodeHex(s.toCharArray()), ENCODING_UTF8); } </code></pre> <p><strong>Update:</strong> Thanks to drawnonward's answer here's the method I wrote to create the hex NSStrings. It gives me an "Initialization discards qualifiers from pointer target type" warning on the char declaration line, but it works.</p> <pre><code>- (NSString *)stringToHex:(NSString *)string { char *utf8 = [string UTF8String]; NSMutableString *hex = [NSMutableString string]; while ( *utf8 ) [hex appendFormat:@"%02X" , *utf8++ &amp; 0x00FF]; return [NSString stringWithFormat:@"%@", hex]; } </code></pre> <p>Haven't had time to write the decoding method yet. When I do, I'll edit this to post it for anyone else interested.</p> <p><strong>Update2:</strong> So the method I posted above actually doesn't output what I'm looking for. Instead of outputting hex values in 0-f format, it was instead outputting all numbers. I finally got back to working on this problem and was able to write a category for NSString that exactly duplicates the Java methods I posted. Here it is:</p> <pre><code>// // NSString+hex.h // Created by Ben Baron on 10/20/10. // @interface NSString (hex) + (NSString *) stringFromHex:(NSString *)str; + (NSString *) stringToHex:(NSString *)str; @end // // NSString+hex.m // Created by Ben Baron on 10/20/10. // #import "NSString+hex.h" @implementation NSString (hex) + (NSString *) stringFromHex:(NSString *)str { NSMutableData *stringData = [[[NSMutableData alloc] init] autorelease]; unsigned char whole_byte; char byte_chars[3] = {'\0','\0','\0'}; int i; for (i=0; i &lt; [str length] / 2; i++) { byte_chars[0] = [str characterAtIndex:i*2]; byte_chars[1] = [str characterAtIndex:i*2+1]; whole_byte = strtol(byte_chars, NULL, 16); [stringData appendBytes:&amp;whole_byte length:1]; } return [[[NSString alloc] initWithData:stringData encoding:NSASCIIStringEncoding] autorelease]; } + (NSString *) stringToHex:(NSString *)str { NSUInteger len = [str length]; unichar *chars = malloc(len * sizeof(unichar)); [str getCharacters:chars]; NSMutableString *hexString = [[NSMutableString alloc] init]; for(NSUInteger i = 0; i &lt; len; i++ ) { [hexString appendString:[NSString stringWithFormat:@"%x", chars[i]]]; } free(chars); return [hexString autorelease]; } @end </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload