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

我有一个解析函数,它将用以字符串格式给出的数据填充字节数组。


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 用数据填充字节数组的正确方法?


沧海一幻觉
浏览 193回答 2
2回答

梦里花落0921

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

浮云间

您可以通过与最初尝试几乎相同的方式获得预期的结果。您的示例的此修改版本产生Value: [0 255 255 0 0 255] Error: <nil>:package mainimport (&nbsp; &nbsp; "bytes"&nbsp; &nbsp; "fmt")func parse(data string) ([]byte, error) {&nbsp; &nbsp; bs := make([]byte, 6)&nbsp; &nbsp; // Create sub slices over larger slice&nbsp; &nbsp; a := bs[0:2]&nbsp; &nbsp; b := bs[2:4]&nbsp; &nbsp; c := bs[4:6]&nbsp; &nbsp; // Attempt to scan each string value into their respective slices&nbsp; &nbsp; _, err := fmt.Sscanf(data, "%4x-%4x-%4x", &a, &b, &c)&nbsp; &nbsp; fmt.Println(a, b, c)&nbsp; &nbsp; return bytes.Join([][]byte{a, b, c}, []byte("")), err}func main() {&nbsp; &nbsp; d, err := parse("00ff-ff00-00ff")&nbsp; &nbsp; fmt.Printf("Value: %+v Error: %v\n", d, err)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go