基本上,这是我的问题:我有一个设备连接到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"]
。这种新方法的唯一问题是它将参数的值作为字符串返回,这在处理int
和int64
时并不是什么大问题,因为我可以使用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:数据参数的字节为十六进制,因此每两个字符对应一个字节,范围从00
到ff
。我提供的示例案例是在尝试使用SigFox发送消息时出现计数错误,并且只有11个字节。从我所看到的Go,这应该不是一个问题,因为我相信它会完成丢失的字节,所以我不认为这是json解码器失败的原因,但我会尝试使用现在正确的字节数。
答案 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[:])