2011-06-29 16 views
5

16進値のNSStringをテキストのNSString(ASCII)に変換する必要があります。例えば は、私のようなものが必要です:文字列をテキストのNSStringに変換しますか?

"68 65 78 61 64 65 63 69 6d 61 6c" to be "hexadecimal" 

私が見て、this threadにコードを微調整しているが、それは私のために働いていません。これは、1つのヘクスペアでのみ機能します。スペースとは何か?ヒントやサンプルコードは非常に高く評価されています。

答えて

8

私はあなたの目的のために同じものを修正します。

NSString * str = @"68 65 78 61 64 65 63 69 6d 61 6c"; 
NSMutableString * newString = [NSMutableString string]; 

NSArray * components = [str componentsSeparatedByString:@" "]; 
for (NSString * component in components) { 
    int value = 0; 
    sscanf([component cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value); 
    [newString appendFormat:@"%c", (char)value]; 
} 

NSLog(@"%@", newString); 
+0

'[NSMutableString string]' plz ... – jtbandes

+0

@jtbandes合意。 :) –

6

NSScannerを使用して各文字を取得できます。各値を区切るにはスペースが必要になります。そうでない場合、スキャナはスキャンを続行し、他のデータは無視します。

- (NSString *)hexToString:(NSString *)string { 
    NSMutableString * newString = [[NSMutableString alloc] init]; 
    NSScanner *scanner = [[NSScanner alloc] initWithString:string]; 
    unsigned value; 
    while([scanner scanHexInt:&value]) { 
     [newString appendFormat:@"%c",(char)(value & 0xFF)]; 
    } 
    string = [newString copy]; 
    [newString release]; 
    return [string autorelease]; 
} 

// called like: 
NSLog(@"%@",[self hexToString:@"68 65 78 61 64 65 63 69 6d 61 6c"]); 
+0

なぜnewStringを返さないのですか? –

+0

@Raffi戻り値の型は不変なので、最初は不変なコピーを作成する方が好きです。 – ughoavgfhw

0

私の場合、ソース文字列にはセパレータがありませんでした。 '303034393934'私の解決策はここにあります。

NSMutableString *_string = [NSMutableString string]; 
for (int i=0;i<12;i+=2) { 
    NSString *charValue = [tagAscii substringWithRange:NSMakeRange(i,2)]; 
    unsigned int _byte; 
    [[NSScanner scannerWithString:charValue] scanHexInt: &_byte]; 
     if (_byte >= 32 && _byte < 127) { 
      [_string appendFormat:@"%c", _byte]; 
      } else { 
      [_string appendFormat:@"[%d]", _byte]; 
      } 
} 
NSLog(@"%@", _string); 
関連する問題