Golang:验证字符串是否为有效的十六进制字符串?

fkaflof6  于 2023-01-18  发布在  Go
关注(0)|答案(2)|浏览(453)

我有一个结构体:

type Name struct {
    hexID string
    age uint8
}

检查hexID字段是否为有效的十六进制字符串的最简单方法是什么?如果不是,则引发错误。
例如:

var n Name
n.hexID = "Hello World >)" // not a valid hex
n.hexID = "aaa12Eb9990101010101112cC" // valid hex

或者可能存在结构体tag

ni65a41a

ni65a41a1#

迭代字符串的字符,并检查每个字符是否都是有效的十六进制数字。

func isValidHex(s string) bool {
    for _, r := range s {
        if !(r >= '0' && r <= '9' || r >= 'a' && r <= 'f' || r >= 'A' && r <= 'F') {
            return false
        }
    }
    return true
}

测试:

fmt.Println(isValidHex("Hello World >)"))
fmt.Println(isValidHex("aaa12Eb9990101010101112cC"))

输出(在Go Playground上尝试):

false
true

注意:您可能会尝试使用hex.DecodeString()并检查返回的错误:如果它是nil,它是有效的,但是要注意这个函数要求字符串的长度是偶数(因为它从十六进制数字产生字节,2个十六进制数字形成一个字节),更不用说如果你不需要结果(作为字节片),这会更慢,并且会产生不必要的垃圾(让gc收集)。
另一个解决方案可以使用big.Int.SetString()

func isValidHex(s string) bool {
    _, ok := new(big.Int).SetString(s, 16)
    return ok
}

输出相同,在Go Playground上尝试,但是速度慢,并且使用内存分配(生成垃圾)。

k2arahey

k2arahey2#

这个怎么样

regexp.MatchString("[^0-9A-Fa-f]", n.hexID)

如果字符串包含十六进制非法字符,则为True

相关问题