Golang10进制转16进制的几种方法代码示例

对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进制内容请搜索aitechtogether.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持aitechtogether.com!

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年12月27日
下一篇 2023年12月27日

相关推荐