我有一个解析函数,它将使用字符串格式给出的数据填充字节数组。
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填充数据的字节数组?
答案 0 :(得分:3)
当您运行Sscanf
时,它会重新分配a
,b
和c
的指针,以便它们不再指向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)
}