2011-06-29 17 views
5

Tôi cần phải chuyển đổi một NSString giá trị hex thành một NSString của văn bản (ASCII). Ví dụ, tôi cần một cái gì đó như:Chuyển đổi chuỗi Hex thành NSString văn bản?

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

tôi đã xem xét và chỉnh mã trong this thread, nhưng nó không làm việc cho tôi. Nó chỉ hoạt động với một cặp hex. Một cái gì đó để làm với không gian? Bất kỳ lời khuyên hay mã mẫu nào đều được đánh giá cao.

Trả lời

8

Tôi cũng sẽ sửa đổi điều tương tự cho mục đích của bạn.

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

'[Chuỗi NSMutableString]' plz ... – jtbandes

+0

@jtbandes Đồng ý. :) –

6

Bạn có thể sử dụng NSScanner để nhận từng ký tự. Các khoảng trống sẽ cần thiết để tách riêng từng giá trị hoặc máy quét sẽ tiếp tục quét và bỏ qua các dữ liệu khác.

- (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

Tại sao không chỉ trả lại newString? –

+0

@Raffi Bạn có thể, nhưng vì kiểu trả về là không thay đổi, tôi muốn tạo một bản sao bất biến trước. – ughoavgfhw

0

Trong trường hợp của tôi, chuỗi nguồn không có dấu tách, ví dụ: '303034393934' Đây là giải pháp của tôi.

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