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



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

-(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;
}

如何做到这一点?

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

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

您的问题是,如果字符为null,%c将不产生任何东西,因此您将附加一个空字符串,并最终得到一个包含单个字节的字符串。

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

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

第二,这是这样做的方法吗?

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

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

相反,如果您想避免C和scanf,请查看NSScannerscanHexInt/scanHexLongLong-如果您的字符串从不超过16个十六进制数字,则可以一次性转换整个字符串,然后从生成的无符号64位整数的字节中生成NSString

HTH-

最新更新