【问题标题】:Convert String of Hex to NSString of text?将十六进制字符串转换为文本的 NSString?
【发布时间】:2011-09-24 19:32:24
【问题描述】:

我需要将十六进制值的 NSString 转换为文本 (ASCII) 的 NSString。 例如,我需要这样的东西:

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

我查看并调整了this thread 中的代码,但它对我不起作用。它仅适用于一对十六进制对。跟空格有关系吗?非常感谢任何提示或示例代码。

【问题讨论】:

    标签: iphone objective-c nsstring ascii hex


    【解决方案1】:

    好吧,我会根据你的目的修改同样的东西。

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

    【讨论】:

      【解决方案2】:

      您可以使用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"]);
      

      【讨论】:

      • 为什么不直接返回 newString?
      • @Raffi 你可以,但由于返回类型是不可变的,我更喜欢先创建一个不可变的副本。
      【解决方案3】:

      在我的例子中,源字符串没有分隔符,例如'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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-23
        • 2012-01-06
        • 2018-01-31
        • 2018-01-22
        • 1970-01-01
        • 2013-02-07
        • 2012-06-16
        相关资源
        最近更新 更多