dpkk8687
2016-05-31 00:52
浏览 104
已采纳

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

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?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • doubi9255 2016-05-31 01:28
    已采纳

    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
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • duanbi8089 2016-05-31 13:27

    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)
    }
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题