为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Sscanf 扫描十六进制字符串的子切片?

如何使用 Sscanf 扫描十六进制字符串的子切片?

Go
沧海一幻觉 2022-01-17 10:09:09
我有一个解析函数,它将用以字符串格式给出的数据填充字节数组。func Parse(data string) ([]byte, error) {    bs := make([]byte, 6)    // Create sub slices over larger slice    a := bs[0:2]    b := bs[2:4]    c := bs[4:6]    // Attempt to scan each string value into their respective slices    _, err := fmt.Sscanf(data, "%4x-%4x-%4x", &a, &b, &c)    return bs, err}在Go Playground上评估此函数,返回字节数组的空值。func main() {    d, err := Parse("00ff-ff00-00ff")    fmt.Printf("Value: %+v Error: %s\n", d, err)}产生:Value: [0 0 0 0 0 0] Error: %!s(<nil>)我预计上述方法会返回[0 255 255 0 0 255]。是否有使用 Sscanf 用数据填充字节数组的正确方法?
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

当您运行Sscanf时,它将重新分配 、 和 的指针,a以便它们不再指向它们各自在. 如果您输出这些变量的值,您会看到这一点:bcbs


fmt.Printf("%v %v %v", a, b, c)

# Outputs [0 255] [255 0] [0 255]

您可以像这样返回结果:


result := append(a, b...)

result = append(result, c...)

return result, nil


查看完整回答
反对 回复 2022-01-17
?
浮云间

TA贡献1829条经验 获得超4个赞

您可以通过与最初尝试几乎相同的方式获得预期的结果。您的示例的此修改版本产生Value: [0 255 255 0 0 255] Error: <nil>:


package main


import (

    "bytes"

    "fmt"

)


func parse(data string) ([]byte, error) {

    bs := make([]byte, 6)


    // Create sub slices over larger slice

    a := bs[0:2]

    b := bs[2:4]

    c := bs[4:6]


    // Attempt to scan each string value into their respective slices

    _, err := fmt.Sscanf(data, "%4x-%4x-%4x", &a, &b, &c)


    fmt.Println(a, b, c)

    return bytes.Join([][]byte{a, b, c}, []byte("")), err

}


func main() {

    d, err := parse("00ff-ff00-00ff")

    fmt.Printf("Value: %+v Error: %v\n", d, err)

}


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信