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

时间:2016-05-31 00:52:23

标签: go

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

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 个答案:

答案 0 :(得分:3)

当您运行Sscanf时,它会重新分配abc的指针,以便它们不再指向bs内各自的位置1}}。如果输出这些变量的值,您将看到这一点:

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

答案 1 :(得分:1)

您可以通过您最初尝试的几乎相同的方式获得您期望的结果。您示例的此修改版本会生成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)
}