開發(fā)中可能有這種需求:
服務(wù)器給了一個(gè)表示16進(jìn)制數(shù)的字符串:“8040000”盹沈,我們用計(jì)算機(jī)轉(zhuǎn)換一下知道它的實(shí)際意思是一個(gè)10進(jìn)制值——134479872肥卡,最終我們的目的是轉(zhuǎn)化成十進(jìn)制數(shù)便于計(jì)算和顯示衡未。而在程序中复斥,我們只能通過代碼實(shí)現(xiàn)這個(gè)轉(zhuǎn)換過程戚丸。
一開始仲锄,我的方法是將每一個(gè)字符拆分出來(lái)霞丧,按位計(jì)算值再累加呢岗,過程繁瑣且代碼不好看。
后找到一種快速簡(jiǎn)潔的方式:
let a = Scanner.init(string: resArr.last!)
var b:UInt32 = 0
if withUnsafeMutablePointer(to: &b, {
a.scanHexInt32($0)
}){
print(b)
}
解釋: 首先想到使用 Scanner
做載體瀏覽蛹尝,然后發(fā)現(xiàn) Scanner
有一個(gè)a.scanHexInt32
方法后豫,大概描述是找到載體中的16進(jìn)制內(nèi)容,轉(zhuǎn)化成Int32數(shù)值然后放入傳入的指針中突那。 withUnsafeMutablePointer
是獲取對(duì)象的指針的方式挫酿,并允許在閉包內(nèi)對(duì)指針進(jìn)行修改(這里我們修改了變量b
的值),結(jié)果返回一個(gè) Bool 值愕难,代表操作是否成功早龟。最終,我們獲取的十進(jìn)制值在b的地址中了猫缭。
運(yùn)行:
//134479872