将十六进制字符串转换为ASCII格式

时间:2016-06-08 10:12:03

标签: ios objective-c ascii

我有一个十六进制字符串,如“000000000100”,我使用以下逻辑进行ASCII转换,我收到的输出只有1个字节(\ x01)但我希望输出为6字节格式为\ x00 \ X00 \ X00 \ X00 \ X01 \ X00

-(NSString*) decode
{
   string=@"000000000100";
   NSMutableString * newString = [[NSMutableString alloc]init];
  int i = 0;
  while (i < [string length])
  {
     NSString * hexChar = [string substringWithRange: NSMakeRange(i, 2)];
     int value = 0;
     sscanf([hexChar cStringUsingEncoding:NSASCIIStringEncoding], "%x", &value);
     [newString appendFormat:@"%c", (char)value];
     i+=2;
  }
return newString;

}

怎么做?

1 个答案:

答案 0 :(得分:0)

让我们首先直接解决您的错误:在您的代码中,您尝试将下一个字节添加到字符串中:

[newString appendFormat:@"%c", (char)value];

你的问题是%c如果字符为空则产生 nothing ,所以你要附加一个空字符串,当你发现最终得到一个字符串,其中包含一个字节

您可以通过测试null并附加包含单个null的字符串来修复代码:

if (value == 0)
   [newString appendString:@"\0"]; // append a single null
else
   [newString appendFormat:@"%c", (char)value];

其次,这是这样做的方法吗?

其他答案已经向您展示了其他算法,它们可能比您的更有效,因为它们只转换为C字符串一次,而不是重复提取子字符串并单独转换每个字符串。

当且仅当性能对您来说是一个真正的问题时,您可能希望考虑这样的基于C的解决方案。您清楚地知道如何使用scanf,但在这种简单的情况下,您可能需要查看digittoint并自己将两个十六进制数字转换为整数(第一个值为* 16 +价值第二)。

相反,如果你想避免使用C并scanf查看NSScannerscanHexInt / scanHexLongLong - 如果你的字符串永远不会超过16位十六进制数字你可以一次转换整个字符串,然后从结果无符号64位整数的字节中产生NSString

HTH