将hex转换为rgb导致白色

时间:2016-06-26 07:33:41

标签: objective-c uicolor rgba

我有这个代码用于颜色转换:

// 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];
}

问题是当我在模拟器上测试此代码时返回正确的颜色,但是当我在设备(iPad mini 1)上测试这个颜色时返回

  

UIDeviceRGBColorSpace 1 1 1 0.0156863

是白色的!

1 个答案:

答案 0 :(得分:1)

iPad mini 1有一个32位CPU,类型long是一个32位有符号整数。

数字0xffdd6858溢出32位有符号整数范围,因此将返回最大数字0x7fffffff,这是一个半透明的白色。

要解决此问题,请使用strtoul确保我们至少有一个无符号的32位整数:

unsigned long x = strtoul(cStr+1, NULL, 16);

代码在模拟器上运行正常,因为您的计算机应该是64位CPU,long是64位有符号整数,因此strtol调用不会溢出并保持实际值。

请考虑重复使用mRs-/HexColorstinymind/UIColor-HexRGB等现有库,而不是编写自己的方法。