【问题标题】:Golang: dealing with binary dataGolang:处理二进制数据
【发布时间】:2017-05-10 03:47:14
【问题描述】:

我有应用程序客户端(javascript)-服务器(golang),它们之间的连接都在 websocket 上。我正在计划使用二进制消息,我想创建自己的消息协议,如本页 protocol 中所示。

我已经在 javascript 中使用 DataView 解决了这个问题,但在 golang 中没有。事件原始数据类型相似,例如它们有 int8、uint8、int16、uint16 等,我想不通。

这是消息框:

1      Uint8      opcode
2      Uint16     msg

这是处理带有上述消息框的 websocket 传入消息的 javascript 代码示例:

websocket.onmessage = function(evt) {
    var data = new DataView(evt.data);
    var opcode = data.getUint8(0);
    var msg = data.getUint16(1);
}

你能告诉我如何在 golang 中做到这一点吗?我正在使用gorilla websocket。我知道已读消息在[]byte 中,但我不知道如何像 javascript 对 DataView 那样对它进行切片。

谢谢

【问题讨论】:

  • 我建议你使用Protobuf 或者只是JSON
  • 感谢您的推荐,我之前已经使用 JSON 执行此操作,但现在是优化阶段,因此我需要切换到二进制数据。我想要原始二进制数据的解决方案,就像我在 javascript 中的示例一样。

标签: javascript go websocket


【解决方案1】:

对于 uint16,您需要二进制包。仔细检查 LittleEndian 是否是您想要的。

package main

import (
    "encoding/binary"
)

func main() {
    a := []byte("yak")

    /* opcode  */ _ = uint8(a[0])
    /* message */ _ = binary.LittleEndian.Uint16(a[1:3])
}

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

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 2011-08-16
    • 2011-06-24
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多