c - 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;
}
解决方案
到 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。
推荐阅读
- python - aiohttp.client_exceptions.ClientOSError: [WinError 10054] 现有连接被远程主机强行关闭
- postgresql - postgres 查询以计算包含 ' 或 : 或 " 和空格的数据
- python - 用openpyxl(python)在一列中多行写入HEX-BIN转换
- javascript - JavaScript 中的多选和全选问题
- erlang - 匿名`gen_server`实例?
- php - 何时在 laravel mvc 框架中使用服务层
- visual-c++ - vc++ 应用程序向后兼容性
- jsf - 从用 JSF 制作的 Java Web 应用程序下载 pdf 文件
- python - 如何解决安装 pygame 的问题?
- javascript - 如何使用内页中的锚进行重定向?