如何在obj-c中将二进制数据转换为十六进制值?示例:
1111 = F,
1110 = E,
0001 = 1,
0011 = 3.我的NSString是10010101010011110110110011010111,我想把它转换成十六进制值。目前我是以手动的方式做的。那就是,
-(NSString*)convertToHex:(NSString*)hexString{ NSMutableString *转换字符串= [NSMutableString分配初始化];
for (int x = 0; x < ([hexString length]/4); x++) {
int a = 0;
int b = 0;
int c = 0;
int d = 0;
NSString *A = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x)]];
NSString *B = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+1)]];
NSString *C = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+2)]];
NSString *D = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+3)]];
if ([A isEqualToString:@"1"]) { a = 8;}
if ([B isEqualToString:@"1"]) { b = 4;}
if ([C isEqualToString:@"1"]) { c = 2;}
if ([D isEqualToString:@"1"]) { d = 1;}
int total = a + b + c + d;
if (total < 10) { [convertingString appendFormat:@"%i",total]; }
else if (total == 10) { [convertingString appendString:@"A"]; }
else if (total == 11) { [convertingString appendString:@"B"]; }
else if (total == 12) { [convertingString appendString:@"C"]; }
else if (total == 13) { [convertingString appendString:@"D"]; }
else if (total == 14) { [convertingString appendString:@"E"]; }
else if (total == 15) { [convertingString appendString:@"F"]; }
}
NSString *convertedHexString = convertingString;
return [convertedHexString autorelease];
[convertingString release];
}谁有更好的建议?这太耗时了。提前谢谢。
发布于 2011-11-30 18:08:03
我自己从来不是一个C语言的黑客,但是像这样的问题对于C语言来说是完美的,所以我有一个谦虚的建议--编码为测试代码在Mac上运行,但你应该能够复制出相关的代码在iOS下使用:
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];
NSString *str = @"10010101010011110110110011010111";
char* cstr = [str cStringUsingEncoding: NSASCIIStringEncoding];
NSUInteger len = strlen(cstr);
char* lastChar = cstr + len - 1;
NSUInteger curVal = 1;
NSUInteger result = 0;
while (lastChar >= cstr) {
if (*lastChar == '1')
{
result += curVal;
}
/*
else
{
// Optionally add checks for correct characters here
}
*/
lastChar--;
curVal <<= 1;
}
NSString *resultStr = [NSString stringWithFormat: @"%x", result];
NSLog(@"Result: %@", resultStr);
[p release];
}这似乎是有效的,但我相信仍有改进的空间。
发布于 2011-11-25 15:06:25
@interface bin2hex : NSObject
+(NSString *)convertBin:(NSString *)bin;
@end
@implementation bin2hex
+(NSString*)convertBin:(NSString *)bin
{
if ([bin length] > 16) {
NSMutableArray *bins = [NSMutableArray array];
for (int i = 0;i < [bin length]; i += 16) {
[bins addObject:[bin substringWithRange:NSMakeRange(i, 16)]];
}
NSMutableString *ret = [NSMutableString string];
for (NSString *abin in bins) {
[ret appendString:[bin2hex convertBin:abin]];
}
return ret;
} else {
int value = 0;
for (int i = 0; i < [bin length]; i++) {
value += pow(2,i)*[[bin substringWithRange:NSMakeRange([bin length]-1-i, 1)] intValue];
}
return [NSString stringWithFormat:@"%X", value];
}
}
@end
int main (int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
NSLog(@"0x%@",[bin2hex convertBin:@"10010101010011110110110011010111"]);
}
return 0;
}我得到了10010101010011110110110011010111的0x954F6CD7结果,它似乎是即时的
发布于 2011-11-25 14:44:08
也许最简单的方法是设置一个NSDictionary来进行快速查找?
[NSDictionary dictionaryWithObjects...]因为它是有限数量的条目。
"0000" -> 0
...
"1111" -> Fhttps://stackoverflow.com/questions/8265525
复制相似问题