将hexstring转换为ASCII格式

我有一个像“000000000100”hexstring,我正在使用下面的逻辑来做ASCII转换,我收到的输出只有一个字节(\ 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; } 

怎么做 ?

我们首先直接解决你的bug:在你的代码中,你尝试使用下面的代码将下一个字节添加到你的string中:

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

你的问题是,如果字符为空, %c 不会产生任何东西 ,所以你正在附加一个空string,而你发现最后只有一个字节的string。

你可以通过testingnull来修正你的代码,并附加一个包含单个null的string:

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

其次,这是这样做的吗?

其他答案向您展示了其他algorithm,它们可能比您的algorithm效率更高,因为它们只是一次转换为Cstring,而不是反复提取子string并逐个转换。

当且仅当性能对您来说是一个真正的问题时,您可能希望考虑这种基于C的解决scheme。 你清楚地知道如何使用scanf ,但是在这样一个简单的例子中,你可能想看看digittoint并且自己将两个hex数字转换为一个整数(第一个值* 16 +第二个值)。

相反,如果您想要避免使用C和scanf查看NSScannerscanHexInt / scanHexLongLong – 如果您的string长度不超过16个hex数字,则可以一次性转换整个string,然后从结果无符号的字节中生成一个NSString 64位整数。

HTH