将十六进制转换为 rgb 结果为白色
convering hex to rgb result in white
我有这个颜色转换代码:
// takes @"#123456"
+ (UIColor *)colorWithHexString:(NSString *)str {
const char *cStr = [str cStringUsingEncoding:NSASCIIStringEncoding];
long x = strtol(cStr+1, NULL, 16);
return [UIColor colorWithHex:(UInt32)x];
}
// takes 0x123456
+ (UIColor *)colorWithHex:(UInt32)col {
unsigned char r, g, b, a;
b = col & 0xFF;
g = (col >> 8) & 0xFF;
r = (col >> 16) & 0xFF;
a = (col >> 24) & 0xFF;
if (a == 0) {
a = 255.0;
}
return [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:(float)a/255.0f];
}
问题是当我在模拟器上测试此代码时 return 颜色正确,但是当我在设备 (iPad mini 1) 上测试此代码时颜色 return
UIDeviceRGBColorSpace 1 1 1 0.0156863
哪个是白色的!
iPadmini 1有32位CPU,类型long
是32位有符号整数。
数字0xffdd6858
溢出了32位有符号整数范围,因此将return取而代之的是最大数字0x7fffffff
,即半透明的白色。
要解决此问题,请使用 strtoul
确保我们至少有一个无符号 32 位整数:
unsigned long x = strtoul(cStr+1, NULL, 16);
代码在模拟器上没有问题,因为您的计算机应该是 64 位 CPU 并且 long
是 64 位有符号整数,因此 strtol
调用不会' t 溢出并保持实际值。
与其编写自己的方法,不如考虑重用现有的库,例如 mRs-/HexColors or tinymind/UIColor-HexRGB。
我有这个颜色转换代码:
// takes @"#123456"
+ (UIColor *)colorWithHexString:(NSString *)str {
const char *cStr = [str cStringUsingEncoding:NSASCIIStringEncoding];
long x = strtol(cStr+1, NULL, 16);
return [UIColor colorWithHex:(UInt32)x];
}
// takes 0x123456
+ (UIColor *)colorWithHex:(UInt32)col {
unsigned char r, g, b, a;
b = col & 0xFF;
g = (col >> 8) & 0xFF;
r = (col >> 16) & 0xFF;
a = (col >> 24) & 0xFF;
if (a == 0) {
a = 255.0;
}
return [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:(float)a/255.0f];
}
问题是当我在模拟器上测试此代码时 return 颜色正确,但是当我在设备 (iPad mini 1) 上测试此代码时颜色 return
UIDeviceRGBColorSpace 1 1 1 0.0156863
哪个是白色的!
iPadmini 1有32位CPU,类型long
是32位有符号整数。
数字0xffdd6858
溢出了32位有符号整数范围,因此将return取而代之的是最大数字0x7fffffff
,即半透明的白色。
要解决此问题,请使用 strtoul
确保我们至少有一个无符号 32 位整数:
unsigned long x = strtoul(cStr+1, NULL, 16);
代码在模拟器上没有问题,因为您的计算机应该是 64 位 CPU 并且 long
是 64 位有符号整数,因此 strtol
调用不会' t 溢出并保持实际值。
与其编写自己的方法,不如考虑重用现有的库,例如 mRs-/HexColors or tinymind/UIColor-HexRGB。