我设置了一个颜色类,它采用红色/蓝色/绿色值并使用它们创建一个十六进制字符串,然后用于返回颜色。它可以通过提供像这样的红色,蓝色和绿色来初始化
Colour *col = [[Colour alloc] initWithRed:200 Green:100 Blue:05];
这个方法的问题是,如果我传入一个像05这样的值,0被剥离,只传入5,所以蓝色将设置为5而不是05.我的方法返回这是一个有效的十六进制字符串
-(NSString *)getHexString
{
NSString *hexString = [NSString stringWithFormat:@"#%x%x%x", iRed_i,iGreen_i,iBlue_i];
hexString = [hexString uppercaseString];
return hexString;
}
期望每个数字的2个值返回正确的颜色代码,但0被剥离意味着它返回不正确的颜色。
我用来创建颜色的另一种方法是使用十六进制字符串初始化颜色对象,如下所示:
Colour *colour = [[Colour alloc] initWithHex:@"#782402"];
然后我使用扫描仪分隔3个值,如此
if ([sHex_p hasPrefix:@"#"]) sHex_p = [sHex_p substringFromIndex:1];
unsigned int outVal;
NSString *sRed = [sHex_p substringToIndex:2];
NSScanner* scanner = [NSScanner scannerWithString:sRed];
[scanner scanHexInt:&outVal];
[self setRed:outVal];
NSString *sGreen = [[sHex_p substringFromIndex:2] substringToIndex:2];
scanner = [NSScanner scannerWithString:sGreen];
[scanner scanHexInt:&outVal];
[self setGreen:outVal];
NSString *sBlue = [sHex_p substringFromIndex:4];
scanner = [NSScanner scannerWithString:sBlue];
[scanner scanHexInt:&outVal];
[self setBlue:outVal];
}
但同样的问题,在十六进制字符串中我提供的最后两个值是02,但是当从int转换为字符串时,那个0将被剥离,所以只有一个2将被传递,再次以不正确的方式结束颜色。
我真的不确定解决这个问题的最佳方法是什么。如果有人能指出正确的方向,我将非常感激。
我一直在这里使用这个网站进行测试
快速示例我正在尝试创建此十六进制字符串“#DB4200”。它需要红色= 219绿色= 66,蓝色= 00
但是当蓝色从字符串转换为int时设置为0,最终返回不正确的颜色,十六进制字符串最终为“#DB420”
答案 0 :(得分:1)
嗯,这实际上涉及三种不同的情况。首先,05只是5,
在十六进制和十进制基数。问题不在于您的输入
这种情况,但可能与输出。但是,请记住这是一个小数
文字,所以如果你想#101010
表示每种颜色255中的16个,请使用
十六进制常量,如0x10
。
第二:关于产出。您正在使用的格式字符串不强制2
每种颜色的数字,这就是您的05
变为5
的原因。你可以强迫
整数(十六进制形式)输出为用零填充的两位数
使用%02x
代替%x
。
sscanf
的替代版本。
- (void)interpretHexString(NSString *str)
{
int r,g,b;
const char *s = [str cStringUsingEncoding:NSUTF8StringEncoding];
if (sscanf(s, "#%02x%02x%02x", &r, &g, &b) != 3) {
/* problem with input */
} else {
/* set ivars */
[self setRed:r];
[self setGreen:g];
[self setBlue:b];
}
}