首页 > 解决方案 > Objective-c:为什么我继承的这段代码中使用了strtol方法?

问题描述

我最近继承了一些 Objective-C 代码,对它实际上在做什么感到很困惑?

1)我不明白为什么char byte_chars[3]先填充'0'然后最后填充0?

2)我不明白为什么他们使用unsigned char了整个字节,但把它放了很长?

3)我的一部分对strtol方法在这里做什么有点困惑,它需要3个byte_chars字节(十六进制),然后将它们转换为long?

- (NSString *)starFromFlags:(NSString *)flags {
    unsigned char wholeByte; 
    char byte_chars[3];
    NSString *star = @"NO";

    byte_chars[0] = '0'; 
    byte_chars[1] = [flags characterAtIndex:1]; 
    byte_chars[2] = 0; 
    wholeByte = strtol(byte_chars, NULL, 16); 

    if (wholeByte & 0x01) star = @"YES";

    return star;
}

标签: cobjective-cstrtol

解决方案


到 1:

末尾的 0 是末尾的 '\0'(两个值都为零),这意味着“字符串在此处结束”。你必须把它放在最后才能结束字符串。

开头的“0”(字母 0)表示一个八进制值(不是十六进制,即“0x”)strtol()。但正如 CRD 正确提到的(见评论),它在这里被传递给的第三个 arg 覆盖strtol()。所以到这里你有一个双字母字符串,第一个字符为 0,第二个字符为标志的十六进制表示。

其原因可能是,标志包含从 '0' 到 'f'₁₆/'F'₁₆(0 到 15₁₀)的数字。

至 2:

由于转换可能产生的值在 [0…15] 范围内,因此 long 值将具有此值之一。您可以将其存储在单个字节中,并且不需要整个 long。但是,strtol()总是返回一个long。

至 3:

是的,它是从包含数字的字符串到数字的转换。即字符串“06”将被转换为数字6。


推荐阅读