Golang10進制轉16進制的幾種方法代碼示例
對Golang10進制轉16進制的幾種方法做了一些總結,一切盡在代碼中:
func main() { // 以下為10進制轉16進制的幾種方式: //1 手擼 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位(一個16進制數(shù)),取下標,拼接成字符串, 右移過程中,先取低位,因此拼接過程需要對結果做反轉。 給出的兩種實現(xiàn)區(qū)別僅在于反轉的方式不同: 1.先循環(huán)一次,找到轉換后16進制數(shù)的長度,拼接時從后往前。(長得有點難看) 2.直接用切片間的 append 反向拼接(每次構建新的切片,占用較多空間) */ // 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 單個元素,結果是倒序的 temp := []byte{digits[di&0xF]} temp = append(temp, ret...) ret = temp di >>= 4 } // 最高位在循環(huán)外,單獨取 temp := []byte{digits[di&0xF]} return string(append(temp, ret...)) }
基于以上原理,可以寫一個32進制下的通用轉換:
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)右移實現(xiàn),只適用10到2的n次冪(2,4,8,16,32)進制的轉換。
補充:意外發(fā)現(xiàn)golang math 包下提供了log函數(shù),方法1 可以更優(yōu)雅的實現(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:十進制切片數(shù)組轉換為16進制字符串
//十進制切片數(shù)組轉換為16進制字符串 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 }
總結
到此這篇關于Golang10進制轉16進制的幾種方法的文章就介紹到這了,更多相關Golang10進制轉16進制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言入門教程之Arrays、Slices、Maps、Range操作簡明總結
這篇文章主要介紹了Go語言入門教程之Arrays、Slices、Maps、Range操作簡明總結,本文直接給出操作代碼,同時對代碼加上了詳細注釋,需要的朋友可以參考下2014-11-11Golang開發(fā)Go依賴管理工具dep安裝驗證實現(xiàn)過程
這篇文章主要為大家介紹了Golang開發(fā)Go依賴管理工具dep安裝驗證及初始化一系列實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11