2011-11-25 162 views
1

如何在obj-c中将二进制数据转换为十六进制值? 例子:将二进制位转换为十六进制值

1111 = F, 
1110 = E, 
0001 = 1, 
0011 = 3. 

我有一个10010101010011110110110011010111 NSString的,我想将其转换为十六进制值。 目前我正在做一个手动的方式。其是,

-(NSString*)convertToHex:(NSString*)hexString 

{ 的NSMutableString * convertingString = [[ALLOC的NSMutableString] INIT];

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]; 

} 

有人有更好的建议吗?这需要很长时间。 在此先感谢。

+0

看看这[潜在的重复问题](http://stackoverflow.com/questions/819487/efficiently-convert-between-hex-binary-and-decimal-in-c-c)。 –

+0

检查这个答案,它适用于我 http://stackoverflow.com/a/21749758/1000906 –

回答

1

我从来都没有多大一个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]; 
} 

看来工作,但我相信还有改进的空间。

0

也许最简单的方法是设置一个NSDictionary进行快速查找?

[NSDictionary dictionaryWithObjects...] 

因为它是有限数量的条目。

"0000" -> 0 
... 
"1111" -> F 
1
@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; 
} 

我得到的0x954F6CD710010101010011110110110011010111的结果,这似乎是瞬间

+0

谢谢! 我在这里有一个问题,为什么你先将它“砍”成16个二进制字符,后来才用4个二进制字符做工? – user774150

+0

,因为int只能处理16位 – DanZimm

+0

您可以将它切换到一个长度为32或64位的长,具体取决于您的系统 – DanZimm