要求

写一个实现字符串转为整形的函数

以16进制方式解析

不能使用库函数

思路

1、输入字符串b
3、反转字符串,并赋给字符串数组A
2、循环zhi检测数组A,依次检测1每个字符
5、判断当前检测的字符,如果属于ABCDEF,则依次把ABCDEF 转换为11....16,否则不做任何操作
6、累加,当前循环次数的16次方乘以当前字符的数值大小。
7、输出总累加值就是10进制整数

解决办法

使用库函数

func Str16ToInt(str string) (num int64) {
    //第二个参数base设置为0时,该函数会自动识别数字格式进行转换。以下是go语言源代码里面的注释:
    //If base == 0, the base is implied by the string's prefix: base 16 for "0x", base 8 for "0", and base 10 otherwise.
    //翻译一下:如果base为0,base的值会根据字符串s起始自动进行判断:如果字符串以0x开始,base=16;如果字符串以0开始base=8;以其他字符串开始base=10
    num, err := strconv.ParseInt(str, 16, 32)
    if err != nil {
        fmt.Println(err)
        return 0
    }
    return num
}

这个简单,使用strconv.ParseInt函数即可

自己写

func Str16ToIntMe(str string) (num float64) {
    var n uint8
    //判断是否包含0x
    if strings.Index(str, "0x") == 0 {
        str = str[2:]
    }
    //获取到字符串长度
    strLen := len([]rune(str))
    for i := 0; i < strLen; i++ {
        if str[i] >= 'A' && str[i] <= 'F' {
            n = str[i] - 'A' + 10
        } else if str[i] >= 'a' && str[i] <= 'f' {
            n = str[i] - 'a' + 10
        } else {
            n = str[i] - '0'
        }
        num += math.Pow(16, float64(i)) * float64(n)
    }
    return num
}

总结

重点是思路,怎么去做,然后怎么获取abcdef转换,该乘以哪个数。

完整代码

代码

package main

import (
    "fmt"
    "math"
    "strconv"
    "strings"
)

//写一个实现字符串转为整形的函数
//要求 以16进制方式解析
//不能使用库函数

func main() {
    str := "0xffff"
    fmt.Printf("使用strconv.ParseInt转换: %v\n", Str16ToInt(str))
    fmt.Printf("使用自己写的函数转换: %v\n", Str16ToIntMe(str))
}

func Str16ToInt(str string) (num int64) {
    //第二个参数base设置为0时,该函数会自动识别数字格式进行转换。以下是go语言源代码里面的注释:
    //If base == 0, the base is implied by the string's prefix: base 16 for "0x", base 8 for "0", and base 10 otherwise.
    //翻译一下:如果base为0,base的值会根据字符串s起始自动进行判断:如果字符串以0x开始,base=16;如果字符串以0开始base=8;以其他字符串开始base=10
    num, err := strconv.ParseInt(str, 0, 32)
    if err != nil {
        fmt.Println(err)
        return 0
    }
    return num
}

/**
5、判断当前检测的字符,如果属于ABCDEF,则依次把ABCDEF 转换为11....16,否则不做任何操作
6、累加,当前循环次数的16次方乘以当前字符的数值大小。
7、输出总累加值就是10进制整数
**/
func Str16ToIntMe(str string) (num float64) {
    var n uint8
    //判断是否包含0x
    if strings.Index(str, "0x") == 0 {
        str = str[2:]
    }
    //获取到字符串长度
    strLen := len([]rune(str))
    for i := 0; i < strLen; i++ {
        if str[i] >= 'A' && str[i] <= 'F' {
            n = str[i] - 'A' + 10
        } else if str[i] >= 'a' && str[i] <= 'f' {
            n = str[i] - 'a' + 10
        } else {
            n = str[i] - '0'
        }
        num += math.Pow(16, float64(i)) * float64(n)
    }
    return num
}

输出