【问题标题】:Slice can not convert to string切片无法转换为字符串
【发布时间】:2015-03-24 23:50:15
【问题描述】:
func (this *AdminModel) Login(v_name string, v_pwd string) (bool, error, uint) {
    o := orm.NewOrm()
    v_pwd_encrypt_byte := md5.Sum([]byte(v_pwd))
    v_pwd_encrypt := string(v_pwd_encrypt_byte[:])
    t_admin := Admin{Name: v_name, Pwd: v_pwd_encrypt}
    fmt.Printf("username:%v  password:%v\n", v_name, v_pwd_encrypt_byte)
    fmt.Printf("username:%v  password:%v\n", v_name, v_pwd_encrypt_byte[:])
    fmt.Printf("username:%v  password:%v\n", v_name, v_pwd_encrypt)
    err := o.Read(&t_admin, "Name", "Pwd")
    if err != nil {
        return false, err, 0
    } else {
        return true, nil, t_admin.Id
    }
}

打印结果:

username:yuhaya  password:[97 22 175 237 203 11 195 16 131 147 92 28 38 47 244 201]
username:yuhaya  password:[97 22 175 237 203 11 195 16 131 147 92 28 38 47 244 201]
username:yuhaya  password:a???
                          ???\&/??

为什么最后一行打印结果乱码?

v_pwd_encrypt := string(v_pwd_encrypt_byte[:])

这个职位是不可能的吗?

【问题讨论】:

标签: string go type-conversion slice


【解决方案1】:

md5.Sum() 返回字节,而不是可打印的 ASCII 字符。如果您想查看这些字节的十六进制表示,可以使用fmt.Sprintf("%x", ...),如下所示:

v_pwd_encrypt := fmt.Sprintf("%x", v_pwd_encrypt_byte)

【讨论】:

    【解决方案2】:

    添加到@Ainar-G 的答案中,hex.EncodeToString 是最有效的方法,因为它不像 fmt.Sprintf 那样涉及反射或类型猜测。

    func main() {
        sum := md5.Sum([]byte("meh"))
        stringSum := hex.EncodeToString(sum[:])
        fmt.Println(stringSum)
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 2021-03-02
      • 1970-01-01
      • 2015-05-15
      • 2017-02-19
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多