2016-06-08 79 views
0

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

-(NSString*) decode 
{ 
    [email protected]"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; 

} 

如何做到这一点?

+0

但我想传递一个字符串 – stacker

+0

这里是我的回答如此http://stackoverflow.com/a/37702822/6124910 – Patrick

回答

0

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

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

您的问题是%c产生什么如果字符是一个空的,所以您正在附加一个空字符串,并且您发现最终会得到一个带有单字节的字符串。

您可以通过测试空和附加包含单个空字符串解决您的代码:

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个十六进制数字永远不再可以将整个字符串从字节转换一气呵成,然后产生一个NSString结果无符号的64位整数。

HTH

相关问题