如何将NSString转换为hex值
我想转换一个正常的NSString到一个NSString与(我所认为的)ASCIIhex值,并返回。
我需要产生与下面的Java方法相同的输出,但我似乎无法在Objective-C中find方法。 我在C和C ++中发现了一些例子,但是我很难将它们写入我的代码中。
这里是我试图重现的Java方法:
/** * 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); }
更新:感谢draononward的答案这里是我写的创buildhexNSStrings的方法。 它给了我一个“初始化放弃指针目标types限定符”警告在char声明行,但它的工作原理。
- (NSString *)stringToHex:(NSString *)string { char *utf8 = [string UTF8String]; NSMutableString *hex = [NSMutableString string]; while ( *utf8 ) [hex appendFormat:@"%02X" , *utf8++ & 0x00FF]; return [NSString stringWithFormat:@"%@", hex]; }
还没有时间写解码方法。 当我这样做的时候,我会编辑这张照片给其他感兴趣的人。
Update2:所以我上面发布的方法实际上不会输出我在找什么。 而不是以0-f格式输出hex值,而是输出所有数字。 我终于回到了这个问题的工作,并能够写一个NSString的类别,正好与我发布的Java方法重复。 这里是:
// // 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 < [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:&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 < len; i++ ) { [hexString appendString:[NSString stringWithFormat:@"%x", chars[i]]]; } free(chars); return [hexString autorelease]; } @end
对于这些Java的行
utf8 = s.getBytes(ENCODING_UTF8); new String(decodedHexString, ENCODING_UTF8);
Objective-C等价物将是
utf8 = [s UTF8String]; [NSString initWithUTF8String:decodedHexString];
使用string的hex表示制作NSString:
NSMutableString *hex = [NSMutableString string]; while ( *utf8 ) [hex appendFormat:@"%02X" , *utf8++ & 0x00FF];
你将不得不使自己的decodeHex函数。 只要从string中取出两个字符,并且如果有效的话,就向结果添加一个字节。
将nsstring转换为hex值的完美方法
NSMutableString *tempHex=[[NSMutableString alloc] init]; [tempHex appendString:@"0xD2D2D2"]; unsigned colorInt = 0; [[NSScanner scannerWithString:tempHex] scanHexInt:&colorInt]; lblAttString.backgroundColor=UIColorFromRGB(colorInt);
这个代码所使用的macros是—-
#define UIColorFromRGB(rgbValue) [UIColor \colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \ green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \ blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
你的stringToHex方法有一个问题 – 它会丢弃前导0,并忽略00s。 就像一个快速修复,我做了如下:
+ (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 < len; i++ ) { // [hexString [NSString stringWithFormat:@"%02x", chars[i]]]; /*previous input*/ [hexString appendFormat:@"%02x", chars[i]]; /*EDITED PER COMMENT BELOW*/ } free(chars); return [hexString autorelease]; }
感谢所有在这个主题上贡献的人。 这对我很有帮助。 由于事情已经从原来的post上移了一下,这里是我更新的iOS 6的实现。我采用了类别的方法,但select分开NSData和NSString之间的负载。 意见欢迎。
首先,NSString的一半,它将一个hex编码的string解码成一个NSData对象。
@implementation NSString (StringToHexData) // // Decodes an NSString containing hex encoded bytes into an NSData object // - (NSData *) stringToHexData { int len = [self length] / 2; // Target length unsigned char *buf = malloc(len) unsigned char *whole_byte = buf; char byte_chars[3] = {'\0','\0','\0'}; int i; for (i=0; i < [self length] / 2; i++) { byte_chars[0] = [self characterAtIndex:i*2]; byte_chars[1] = [self characterAtIndex:i*2+1]; *whole_byte = strtol(byte_chars, NULL, 16); whole_byte++; } NSData *data = [NSData dataWithBytes:buf length:len]; free( buf ); return data; } @end
这些改变主要是出于效率考虑:一些简单的老式指针算术意味着我可以一次性分配整个缓冲区,并逐字节地填充它。 然后整个事情一次性传递给NSData。
NSData中的编码部分如下所示:
@implementation NSData (DataToHexString) - (NSString *) dataToHexString { NSUInteger len = [self length]; char * chars = (char *)[self bytes]; NSMutableString * hexString = [[NSMutableString alloc] init]; for(NSUInteger i = 0; i < len; i++ ) [hexString appendString:[NSString stringWithFormat:@"%0.2hhx", chars[i]]]; return hexString; } @end
再次,一些小的变化,虽然我怀疑没有效率收益在这里。 使用“%0.2hhx”解决了丢失前导零的所有问题,并确保一次只输出一个单字节。
希望这有助于下一个人把这个!
一个可能的scheme
+(NSString*)hexFromStr:(NSString*)str { NSData* nsData = [str dataUsingEncoding:NSUTF8StringEncoding]; const char* data = [nsData bytes]; NSUInteger len = nsData.length; NSMutableString* hex = [NSMutableString string]; for(int i = 0; i < len; ++i)[hex appendFormat:@"%02X", data[i]]; return hex; }
所以,首先,我要感谢他的回答。 这给了我第一个function,意味着干净。 本着同样的精神,我写了另一个。 希望你喜欢。
@synthesize unsigned char* value= _value; - (NSString*) hexString { _value[CONSTANT]= '\0'; unsigned char* ptr= _value; NSMutableString* hex = [[NSMutableString alloc] init]; while ( *ptr ) [hex appendFormat:@"%02x", *ptr++ & 0x00FF]; return [hex autorelease]; } - (void) setHexString:(NSString*)hexString { _value[CONSTANT]= '\0'; unsigned char* ptr= _value; for (const char* src= [hexString cStringUsingEncoding:NSASCIIStringEncoding]; *src; src+=2) { unsigned int hexByte; /*int res=*/ sscanf(src,"%02x",&hexByte); *ptr++= (unsigned char)(hexByte & 0x00FF); } *ptr= '\0'; }
我的input是一个数字base10string,输出应该是string格式的hex表示。 例子:
- @“10” – > @“A”
- @“1128” – > @“468”
- @“1833828235” – > @“6D4DFF8B”
执行:
+ (NSString *) stringToHex:(NSString *)str{ NSInteger result = [str integerValue]; NSString *hexStr = (result)?@"":@"0"; while (result!=0) { NSInteger reminder = result % 16; if(reminder>=0 && reminder<=9){ hexStr = [[NSString stringWithFormat:@"%ld",(long)reminder] stringByAppendingString:hexStr]; }else if(reminder==10){ hexStr = [@"A" stringByAppendingString:hexStr]; }else if(reminder==11){ hexStr = [@"B" stringByAppendingString:hexStr]; }else if(reminder==12){ hexStr = [@"C" stringByAppendingString:hexStr]; }else if(reminder==13){ hexStr = [@"D" stringByAppendingString:hexStr]; }else if(reminder==14){ hexStr = [@"E" stringByAppendingString:hexStr]; }else{ hexStr = [@"F" stringByAppendingString:hexStr]; } result /=16; } return hexStr;
}
也许你应该使用NSString
dataUsingEncoding:
来编码和initWithData:length:encoding:
来解码。 取决于你从哪里获取数据。
- libMobileGestalt MobileGestaltSupport.m:153 MobileGestalt.c:550 Xcode控制台
- UITableView registerNib:forCellReuseIdentifier:
- 禁用iPhone Web应用程序中的滚动?
- 减lessUITableView的部分之间的空间
- 将图像存储在plist中
- 从分组样式的UITableView部分删除单元格边框
- HTML <label>命令在Iphone浏览器中不起作用
- UIWebView是否可以保存和自动填写以前input的表单值(例如,用户名和密码)?
- 如何在使用ARC并定位iOS 4.0时replace弱引用?