I have a parsing function that will fill a byte array with data given in a string format.
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
}
Evaluating this function on the Go Playground the null value of the byte array is returned.
func main() {
d, err := Parse("00ff-ff00-00ff")
fmt.Printf("Value: %+v Error: %s
", d, err)
}
Which yields:
Value: [0 0 0 0 0 0] Error: %!s(<nil>)
I expected the above approach to return [0 255 255 0 0 255]
. Is there a correct approach to populating a byte array with data using Sscanf?
When you run Sscanf
it will re-allocate the pointers for a
, b
, and c
so that they no longer point to their respective locations within bs
. You'll see this if you output the values of these variables:
fmt.Printf("%v %v %v", a, b, c)
# Outputs [0 255] [255 0] [0 255]
You can return the result like this:
result := append(a, b...)
result = append(result, c...)
return result, nil
You can get the result that you expected, and by nearly identical means as you originally attempted. This modified version of your example yields 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
", d, err)
}