Golang10进制转16进制的几种方法代码示例
更新时间:2023年07月10日 09:18:52 作者:风之涯角
这篇文章主要给大家介绍了关于Golang10进制转16进制的几种方法,进制转换是Golang的一些基本操作,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
对Golang10进制转16进制的几种方法做了一些总结,一切尽在代码中:
func main() { // 以下为10进制转16进制的几种方式: //1 手撸 hex := toHex(di) //2 内置的string工具包 hex1 := strconv.FormatInt(int64(di), 16) //3 format 提供的方法 hex2 := fmt.Sprintf("%x", di) }
如果仅是找工具的看客,看到这里就可以止步了,以下内容纯属自娱:
/** 循环右移4位(一个16进制数),取下标,拼接成字符串, 右移过程中,先取低位,因此拼接过程需要对结果做反转。 给出的两种实现区别仅在于反转的方式不同: 1.先循环一次,找到转换后16进制数的长度,拼接时从后往前。(长得有点难看) 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 } // 最高位在循环外,单独取 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)
注意:该方法基于循环右移实现,只适用10到2的n次幂(2,4,8,16,32)进制的转换。
补充:意外发现golang math 包下提供了log函数,方法1 可以更优雅的实现:
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:十进制切片数组转换为16进制字符串
//十进制切片数组转换为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进制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
GoFrame框架gset使用对比PHP Java Redis优势
这篇文章主要为大家介绍了GoFrame框架gset对比PHP Java Redis的使用优势详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-06-06
最新评论