在url params

时间:2017-10-15 13:23:44

标签: string url go byte

基本上,这是我的问题:我有一个设备连接到SigFox,它发送12个字节的数据,然后使用回调将其重新路由到我的golang服务器。我尝试使用通常的路由,并将回调发送的信息解析为带有json.NewDecoder(r.Body).Decode(&m)的json,其中m是一个结构,其中包含SigFox api在回调上发送的信息,也就是:< / p>

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"]。这种新方法的唯一问题是它将参数的值作为字符串返回,这在处理intint64时并不是什么大问题,因为我可以使用strconv包。问题是12个字节的数据。

因为它们是作为字符串接收的,这意味着我得到类似"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:数据参数的字节为十六进制,因此每两个字符对应一个字节,范围从00ff。我提供的示例案例是在尝试使用SigFox发送消息时出现计数错误,并且只有11个字节。从我所看到的Go,这应该不是一个问题,因为我相信它会完成丢失的字节,所以我不认为这是json解码器失败的原因,但我会尝试使用现在正确的字节数。

1 个答案:

答案 0 :(得分:3)

使用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