iOS 16進(jìn)制字符串轉(zhuǎn)數(shù)字,及數(shù)字轉(zhuǎn)16進(jìn)制字符串

之前想自己寫一個(gè)UIColor的分類,實(shí)現(xiàn)可以輸入十六進(jìn)制字符串(例如:0xff8ac)的顏色值來(lái)設(shè)置方便的設(shè)置顏色(雖然網(wǎng)上有很多,但是想自己造輪子嘛),但是關(guān)于十六進(jìn)制和字符串之間的轉(zhuǎn)換一直找不到簡(jiǎn)便的方法來(lái)實(shí)現(xiàn),最近逼著自己看C語(yǔ)言基礎(chǔ)及進(jìn)階的書,總算還是有點(diǎn)收獲,所以第一時(shí)間來(lái)跟大家分享。

1、數(shù)字轉(zhuǎn)十六進(jìn)制字符串

- (NSString *)stringWithHexNumber:(NSUInteger)hexNumber{
    
    char hexChar[6];
    sprintf(hexChar, "%x", (int)hexNumber);
    
    NSString *hexString = [NSString stringWithCString:hexChar encoding:NSUTF8StringEncoding];
    
    return hexString;
}
Paste_Image.png

Paste_Image.png

解釋一下,函數(shù)sprintf是C語(yǔ)言提供的格式化輸出函數(shù),"%x"相信大家都能看懂,就是十六進(jìn)制輸出,如果換成大寫"%X",相應(yīng)的字符串結(jié)果也會(huì)換成大寫。因?yàn)槭桥袛囝伾?,所以字符?shù)組固定6位,最后在最前面做一個(gè)判斷,if(hexNumber > 0xffffff) return nil;。不僅支持十六進(jìn)制,還支持八進(jìn)制輸出"%o",當(dāng)然意義不大。

2、十六進(jìn)制字符串轉(zhuǎn)數(shù)字

- (NSInteger)numberWithHexString:(NSString *)hexString{

    const char *hexChar = [hexString cStringUsingEncoding:NSUTF8StringEncoding];
    
    int hexNumber;
    
    sscanf(hexChar, "%x", &hexNumber);
    
    return (NSInteger)hexNumber;
}
Paste_Image.png

Paste_Image.png

sscanf是C言語(yǔ)提供的格式化輸入函數(shù),很簡(jiǎn)單,當(dāng)然你要顏色值如果是0xabc123格式的你就要自己先判定了。大家可以測(cè)試一下。

3、UIColor分類實(shí)現(xiàn)十六進(jìn)制顏色值轉(zhuǎn)換

.h文件

#import <UIKit/UIKit.h>

@interface UIColor (Hex)
/**
 @param hexString   NSString e.g:@"0xFC5B13"
 @param alpha  alhpa
 */
+ (instancetype)colorWithHexString:(NSString *)hexString alpha:(CGFloat)alpha;
+ (instancetype)colorWithHexString:(NSString *)hexString;

@end

.m文件

#import "UIColor+Hex.h"

@implementation UIColor (Hex)

+ (instancetype)colorWithHex:(int)hexNumber alpha:(CGFloat)alpha{
    
    if (hexNumber > 0xFFFFFF) return nil;
    
    CGFloat red   = ((hexNumber >> 16) & 0xFF) / 255.0;
    CGFloat green = ((hexNumber >> 8) & 0xFF) / 255.0;
    CGFloat blue  = (hexNumber & 0xFF) / 255.0;
    
    UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
    
    return color;
    
}

+ (instancetype)colorWithHexString:(NSString *)hexString alpha:(CGFloat)alpha{
    
    hexString = [[hexString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];
    
    UIColor *defaultColor = [UIColor clearColor];
    
    if (hexString.length < 6) return defaultColor;
    if ([hexString hasPrefix:@"#"]) hexString = [hexString substringFromIndex:1];
    if ([hexString hasPrefix:@"0X"]) hexString = [hexString substringFromIndex:2];
    if (hexString.length != 6) return defaultColor;
    
    //method1
    NSScanner *scanner = [NSScanner scannerWithString:hexString];
    unsigned int hexNumber;
    if (![scanner scanHexInt:&hexNumber]) return defaultColor;
    
    //method2
    const char *char_str = [hexString cStringUsingEncoding:NSASCIIStringEncoding];
    int hexNum;
    sscanf(char_str, "%x", &hexNum);
    
    return [UIColor colorWithHex:hexNumber alpha:alpha];
}

+ (instancetype)colorWithHexString:(NSString *)hexString{
    return [UIColor colorWithHexString:hexString alpha:1.0f];
}

method1是蘋果官方提供的類,功能和method2類似,選一種即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,691評(píng)論 0 4
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對(duì)數(shù)據(jù)進(jìn)行解包。 uni...
    思?jí)鬚HP閱讀 2,146評(píng)論 1 24
  • 什么是代碼注釋?代碼注釋的作用是幫助程序員標(biāo)注代碼的用途,過(guò)一段時(shí)間后再看你所編寫的代碼,就能很快想起這段代碼的用...
    吳迪好閱讀 302評(píng)論 0 0
  • 真正的強(qiáng)大,是看你能吸引多少人、影響多少人。你自己不牛逼,認(rèn)識(shí)再多牛逼的人也沒有用?,F(xiàn)在每個(gè)人都是很現(xiàn)實(shí)的...
    人間正道007閱讀 636評(píng)論 0 1
  • 旅游大巴在山間穿梭,走了什么路過(guò)了幾條隧道,除了因?yàn)榍缣斓木壒?能夠依靠太陽(yáng)的方向辨一辨東南西北,完全是暈暈乎乎到...
    心若芷蘭閱讀 548評(píng)論 5 3

友情鏈接更多精彩內(nèi)容