代码之家  ›  专栏  ›  技术社区  ›  AugustoQ

将字节数组作为url参数中的字符串获取

  •  0
  • AugustoQ  · 技术社区  · 8 年前

    json.NewDecoder(r.Body).Decode(&m) 哪里 m 是包含SigFox api在回调上发送的信息的结构,也称为:

    type SigFoxMessage struct {
        Time int64 `json:"time"` // I'm getting an epoch timestamp, which I then convert to time.Time
        Data [12]byte `json:"data"`
        Lat int `json:"lat"`
        Lng int `json:"lng"`
    }
    

    然而,这总是给我一个EOF错误,所以我决定继续 r.ParseForm() r.Form["key"] . 这种新方法的唯一问题是,它将参数的值作为字符串返回,这在处理 int s和 int64 ,因为我可以使用 strconv

    因为它们是作为字符串接收的,这意味着我得到了类似于 "3132333435363738393130" (以十六进制表示的12个字节,因此每个字节2个字符是确定的),我想将其转换为 [12]byte{31, 32, 33, 34, 35, 36, 37, 38, 39, 31, 30} . 但除了实际实现一个函数来解析它之外,我找不到其他方法来做这件事。我试图搜索字符串到字节数组的转换,但我能找到的只是将字节数组转换为字符串的方法(这将是图灵方法) [12]byte{'1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '0'} "12345678910" ,我对此不感兴趣),或者如何将字符串转换为字符数组( "3132333435363738393130" -> []byte{'3', '1', '3', ... } ),我对此也不感兴趣。

    无论如何,有没有一种不需要编写代码来解析它的实际方法?

    还有,你知道为什么json解码器可能无法工作吗?

    编辑: 我应该马上解决这个问题,请求的参数是这样的:

    ?time=1507834946&data=3132333435363738393130&lat=-8.0&lng=-35.0

    编辑2: 数据参数以十六进制表示字节,因此每两个字符对应一个字节,范围从 00 ff . 我提供的示例是在尝试使用SigFox发送消息时出现计数错误,只有11个字节。从我对Go的了解来看,这应该不是问题,因为我相信它会完成缺失的字节,所以我不认为这是json解码器失败的原因,但我现在将使用正确的字节数进行尝试。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Cerise Limón    8 年前

    使用 encoding/hex 包裹

    r.ParseForm()
    var message SigFoxMessage
    n, err := hex.Decode(message.Data[:], []byte(r.FormValue("data")))
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("decoded %d bytes: %q\n", n, message.Data[:])
    

    https://play.golang.org/p/kfW1t2ADsR