Golang10進(jìn)制轉(zhuǎn)16進(jìn)制的幾種方法代碼示例
對(duì)Golang10進(jìn)制轉(zhuǎn)16進(jìn)制的幾種方法做了一些總結(jié),一切盡在代碼中:
func main() { // 以下為10進(jìn)制轉(zhuǎn)16進(jìn)制的幾種方式: //1 手?jǐn)] hex := toHex(di) //2 內(nèi)置的string工具包 hex1 := strconv.FormatInt(int64(di), 16) //3 format 提供的方法 hex2 := fmt.Sprintf("%x", di) }
如果僅是找工具的看客,看到這里就可以止步了,以下內(nèi)容純屬自娛:
/** 循環(huán)右移4位(一個(gè)16進(jìn)制數(shù)),取下標(biāo),拼接成字符串, 右移過程中,先取低位,因此拼接過程需要對(duì)結(jié)果做反轉(zhuǎn)。 給出的兩種實(shí)現(xiàn)區(qū)別僅在于反轉(zhuǎn)的方式不同: 1.先循環(huán)一次,找到轉(zhuǎn)換后16進(jìn)制數(shù)的長度,拼接時(shí)從后往前。(長得有點(diǎn)難看) 2.直接用切片間的 append 反向拼接(每次構(gòu)建新的切片,占用較多空間) */ // scheme 1: func toHex0(di int) string { index := 0 var o = di for o >= 16 { index++ o >>= 4 } ret := make([]byte, index+1) var i = 0 digits := "0123456789abcdefx" for di >= 16 { ret[index-i] = digits[di&0xF] i++ di >>= 4 } ret[0] = digits[di&0xF] return string(ret) } // scheme 2: func toHex(di int) string { ret := make([]byte, 0) digits := "0123456789abcdefx" for di >= 16 { //從低位往高位取,直接使用切片append 單個(gè)元素,結(jié)果是倒序的 temp := []byte{digits[di&0xF]} temp = append(temp, ret...) ret = temp di >>= 4 } // 最高位在循環(huán)外,單獨(dú)取 temp := []byte{digits[di&0xF]} return string(append(temp, ret...)) }
基于以上原理,可以寫一個(gè)32進(jìn)制下的通用轉(zhuǎn)換:
func toBelow32(di int, base int) string { upperstr := "0123456789abcdefghijklmnopqrstuv" substr := upperstr[0:base] ret := make([]byte, 0) mol := base - 1 mov := math.Log2(float64(base)) for di >= base { temp := []byte{substr[di&mol]} temp = append(temp, ret...) ret = temp di >>= int(mov) } temp := []byte{substr[di&mol]} return string(append(temp, ret...)) } //eg:toBelow32(anynum,16)
注意:該方法基于循環(huán)右移實(shí)現(xiàn),只適用10到2的n次冪(2,4,8,16,32)進(jìn)制的轉(zhuǎn)換。
補(bǔ)充:意外發(fā)現(xiàn)golang math 包下提供了log函數(shù),方法1 可以更優(yōu)雅的實(shí)現(xiàn):
func toHex0(di int) string { index := int(math.Log2(float64(math.Log2(float64(di))))) ret := make([]byte, index+1) var i = 0 digits := "0123456789abcdefx" for di >= 16 { ret[index-i] = digits[di&0xF] i++ di >>= 4 } ret[0] = digits[di&0xF] return string(ret) }
附:Golang:十進(jìn)制切片數(shù)組轉(zhuǎn)換為16進(jìn)制字符串
//十進(jìn)制切片數(shù)組轉(zhuǎn)換為16進(jìn)制字符串 import ( "fmt" "strings" ) func Tool_DecimalByteSlice2HexString(DecimalSlice []byte) string { var sa = make([]string, 0) for _, v := range DecimalSlice { sa = append(sa, fmt.Sprintf("%02X", v)) } ss := strings.Join(sa, "") return ss }
總結(jié)
到此這篇關(guān)于Golang10進(jìn)制轉(zhuǎn)16進(jìn)制的幾種方法的文章就介紹到這了,更多相關(guān)Golang10進(jìn)制轉(zhuǎn)16進(jìn)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié)
這篇文章主要介紹了Go語言入門教程之Arrays、Slices、Maps、Range操作簡(jiǎn)明總結(jié),本文直接給出操作代碼,同時(shí)對(duì)代碼加上了詳細(xì)注釋,需要的朋友可以參考下2014-11-11Golang開發(fā)Go依賴管理工具dep安裝驗(yàn)證實(shí)現(xiàn)過程
這篇文章主要為大家介紹了Golang開發(fā)Go依賴管理工具dep安裝驗(yàn)證及初始化一系列實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Go語言從單體服務(wù)到微服務(wù)設(shè)計(jì)方案詳解
這篇文章主要為大家介紹了Go語言從單體服務(wù)到微服務(wù)設(shè)計(jì)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03