...程序员
我对iOS编程的字符串常量有疑问。
使用此函数将字符串常量用作十六进制值是一种好习惯吗?
+ (NSString *) stringFromHex:(NSString *)str
{
NSMutableData *stringData = [[[NSMutableData alloc] init] autorelease];
unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
int i;
for (i=0; i < [str length] / 2; i++) {
byte_chars[0] = [str characterAtIndex:i*2];
byte_chars[1] = [str characterAtIndex:i*2+1];
whole_byte = strtol(byte_chars, NULL, 16);
[stringData appendBytes:&whole_byte length:1];
}
return [[[NSString alloc] initWithData:stringData encoding:NSASCIIStringEncoding] autorelease];
}
+ (NSString *) stringToHex:(NSString *)str
{
NSUInteger len = [str length];
unichar *chars = malloc(len * sizeof(unichar));
[str getCharacters:chars];
NSMutableString *hexString = [[NSMutableString alloc] init];
for(NSUInteger i = 0; i < len; i++ )
{
[hexString appendString:[NSString stringWithFormat:@"%x", chars[i]]];
}
free(chars);
return [hexString autorelease];
}
所以只需在constants.h文件中定义十六进制值即可。只需通过上面的函数进行转换访问,而不是像以下那样在两个文件(.h和.m)中定义NSString变量:
// #define KAPIURL 0xadff12233434223435345354 // http://apiurl.xxx
在运行时转换是否需要时间,所以它不好?
答案 0 :(得分:0)
我不明白为什么要使用strtol()
来解析字符串为整数值。如果您有字符串 data ,那么这只是一个格式化该数据中十六进制字符的问题:
+ (NSString *) stringFromHex:(NSString *)str
{
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSMutableString *hexString = [[[NSMutableString alloc] init] autorelease];
const uint8_t *bytes = [data bytes];
const NSUInteger length = [data length];
for (NSUInteger i = 0; i < length; i++)
[hexString appendString:[NSString stringWithFormat:@"%02x", bytes[i]]];
return hexString;
}
注意:此方法应称为hexStringFromString
。
答案 1 :(得分:0)
良好的做法?否。
您的代码所做的唯一事情就是出于某种原因使自己无法读取。 我无法理解为什么你甚至会使用以某种十六进制代码编码的字符串。过早优化?通过默默无闻来增加安全性的尝试?我无法在这里看到原因。
不使用#define
作为字符串,而是使用普通字符串常量(请参阅Constants in Objective-C)。
请注意大多数&#34;良好做法&#34;是为了使您的代码更易读和易于维护。您可以从可读代码中获得更多信息,您可以从良好实践中获得更多信息。