我有一个十六进制字符串,如“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;
}
怎么做?
答案 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
查看NSScanner
和scanHexInt
/ scanHexLongLong
- 如果你的字符串永远不会超过16位十六进制数字你可以一次转换整个字符串,然后从结果无符号64位整数的字节中产生NSString
。
HTH