将字符串常量用作十六进制值是一种好习惯吗?

时间:2015-06-02 12:19:07

标签: ios objective-c nsstring

...程序员

我对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

在运行时转换是否需要时间,所以它不好?

2 个答案:

答案 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;是为了使您的代码更易读和易于维护。您可以从可读代码中获得更多信息,您可以从良好实践中获得更多信息。

相关问题