golang 里面如何将string 转换成 uint8?

新手上路,请多包涵

在做项目的时候遇到问题,正常情况下,使用
p := []byte{0x00, 0xb2, 0x01, 0x5c, 0x00} // p的类型是 uint8
将 P 传值使用
但是将 内容 放在一个 string 的数组里面就不可以了,如下图
cardBill := []string{"0x00, 0xb2, 0x01, 0x5c, 0x00"}

打印发现,cardBill[0]的值是 string
我想把 string 转换成 uint8 但是失败了,尝试的方式:
[]byte(cardBill[0])

阅读 8.2k
2 个回答

cardBill你存的字符串是"0x00, 0xb2, 0x01, 0x5c, 0x00"所以[]byte得到的是这个字符串对应的uint8,你需要对逗号分隔的每一项字符串转换成16进制的数字。 或者存储时 cardBill := []string{string(p)}即可。

第一种方案:按string存的时候直接存16进制对应的字符

func main() {
    cardBill := []string{string([]byte{0x00, 0xb2, 0x01, 0x5c, 0x00}),string([]byte{0x00, 0xb2, 0x02, 0x5c, 0x00})}
    p := []byte{0x00, 0xb2, 0x01, 0x5c, 0x00}
    fmt.Println(p)
    fmt.Println([]byte(cardBill[0]))
    return
}
// output:
// [0 178 1 92 0]
// [0 178 1 92 0]

第二种方法:获取cardBill[0]时将字符串解析为16进制

func main() {
    cardBill := []string{"0x00, 0xb2, 0x01, 0x5c, 0x00","0x00, 0xb2, 0x02, 0x5c, 0x00"}
    p := []byte{0x00, 0xb2, 0x01, 0x5c, 0x00}
    p0 := []byte{}
    l := strings.Split(cardBill[0], ",")
    for i := range l {
        s := strings.TrimSpace(l[i])
        num, err := strconv.ParseInt(s, 0, 16)
        if err != nil{
            panic(err)
        }
        p0 = append(p0, uint8(num))
    }
    fmt.Println(p)
    fmt.Println(p0)
    return
}
// output:
// [0 178 1 92 0]
// [0 178 1 92 0]

这两种方法都可以让他们内容是相同的

byte 也就是 unit8,那么你的意思是不就是 []byte 转 string, string 转 []byte??

func b2s(b []byte) string {
    return *(*string)(unsafe.Pointer(&b))
}

func s2b(s string) (b []byte) {
    bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh.Data = sh.Data
    bh.Len = sh.Len
    bh.Cap = sh.Len
    return b
}

func TestC(t *testing.T) {
    p := []byte{0x00, 0xb2, 0x01, 0x5c, 0x00} 
    t.Log(p)
    str := b2s(p)
    t.Log(str)

    np := s2b(str)
    t.Log(np)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏