Вы близки, но colorWithRed: green: blue: alpha: ожидает значения от 0.0 до 1.0, поэтому вам нужно сдвинуть биты вправо и разделить на 255.0f:
CGFloat red = ((baseColor1 & 0xFF0000) >> 16) / 255.0f;
CGFloat green = ((baseColor1 & 0x00FF00) >> 8) / 255.0f;
CGFloat blue = (baseColor1 & 0x0000FF) / 255.0f;
EDIT. Также сканирование NSScannerHexInt пропустит минус 0x перед шестнадцатеричной строкой, но я не думаю, что он пропустит символ # перед вашей шестнадцатеричной строкой. Вы можете добавить эту строку, чтобы обработать это:
[scanner2 setCharactersToBeSkipped:[NSCharacterSet symbolCharacterSet]];
Можно также использовать структура модуль, чтобы сделать это:
>>> struct.unpack("<L", "y\xcc\xa6\xbb")[0]
3148270713L
Как Greg сказал, можно использовать структуру, если Вы имеете дело с двоичными значениями, но если у Вас просто есть "шестнадцатеричное число", но в формате байта Вы могли бы хотеть просто преобразовать ее как:
s = 'y\xcc\xa6\xbb'
num = int(s.encode('hex'), 16)
... это совпадает с:
num = struct.unpack(">L", s)[0]
... кроме он будет работать на любое число байтов.
import array
integerValue = array.array("I", 'y\xcc\xa6\xbb')[0]
Предупреждение: вышеупомянутое является решительно определенным для платформы. И "I" спецификатор и порядок байтов строки-> международное преобразование зависят от Вашей конкретной реализации Python. Но если Вы хотите преобразовать много целых чисел/строк сразу, тогда модуль массива делает это быстро.