Hexa-Tri-Decimal 数字是 0-9 和 AZ。我知道我可以使用 NSScanner 从十六进制转换,但不确定如何转换 Hexa-Tri-Decimal。
例如,我有一个带有“0XPM”的 NSString,int 值应该是 43690,“1BLC”应该是 61680。
Hexa-Tri-Decimal 数字是 0-9 和 AZ。我知道我可以使用 NSScanner 从十六进制转换,但不确定如何转换 Hexa-Tri-Decimal。
例如,我有一个带有“0XPM”的 NSString,int 值应该是 43690,“1BLC”应该是 61680。
Objective C 建立在 C 之上,幸运的是,您可以使用那里的函数来完成转换。您正在寻找的是 strtol 或它的兄弟函数之一。如果我没记错 strtol 最多可以处理base36(您指的十六进制三进制)。
我只能考虑使用 C 字符串来执行此操作,因为它们可以更轻松地访问单个字符。
这似乎是一个需要解决的有趣问题,所以我尝试编写它:
int parseBase36Number(NSString *input)
{
const char *inputCString = [[input lowercaseString] UTF8String];
size_t inputLength = [input length];
int orderOfMagnitudeMultiplier = 1;
int result = 0;
// iterate backward through the number
for (int i = inputLength - 1; i >= 0; i--)
{
char inputChar = inputCString[i];
int charNumericValue;
if (isdigit(inputChar))
{
charNumericValue = inputChar - '0';
}
else if (islower(inputChar))
{
charNumericValue = inputChar - 'a' + 10;
}
else
{
// unhanded character, throw error
}
result += charNumericValue * orderOfMagnitudeMultiplier;
orderOfMagnitudeMultiplier *= 36;
}
return result;
}
注意:我根本没有测试过这个,所以请注意并告诉我它是怎么回事!