我有一个二维字节数组:
data := [][]byte{{104, 105}, {104, 105}}
我需要通过websocket连接传输,但是我找不到如何转换这个数组的方法,所以我可以有效地将它重新转换回我的java客户端上的二维数组。
func socketManager (connection *websocket.Conn ){
fmt.Print("Websocket connection established ")
//determining the request
for {
//awaiting messages from clients
messageType, message, err := connection.ReadMessage()
if err != nil {
//ending connection when error accursed
Logger.LogError(err.(error).Error())
break
}
data := [][]byte{{104, 105}, {104, 105}}
//How can I send this two dimensional byte array?
err = connection.WriteMessage(websocket.BinaryMessage, message)
if err != nil {
log.Println("write:", err)
break
}
err = connection.WriteMessage(messageType, message)
if err != nil {
log.Println("write:", err)
break
}
}
//closing the connection
defer connection.Close()
}
答案 0 :(得分:1)
多维数组通常根据它们的尺寸(即“宽度”和“高度”)及其内容(应分解为“行”或“列”的各个项目的整个列表来定义) )。但是,如果组成数组可能有不同的长度,那么您可能需要完全采用另一种方法。
您的任务是决定如何序列化此数据,以便客户端对其进行反序列化,并强调此传输的任何关键方面(例如数据大小,性能,易于互操作性等)。
以下是一些可能的解决方案:
矩阵尺寸和内容。如果您的数据始终具有一致的“宽度”和“高度”,那么您可以使用原始编码来序列化表示这些值的两个uint16
(或其他适当的大小),然后是一系列原始字节。要反序列化,客户端只需读取两个整数即可知道矩阵的维数,然后可以相应地填充其余数据。示例消息可能如下所示(十六进制字节):
0002 0002 6869 6869
长度和内容。如果每个子阵列可以具有不同的长度,则可以简单地原始编码“长度”元组序列(例如,作为uint32
)和原始字节内容,例如, (作为十六进制字节):
0000 0002 6869 0000 0002 6869
JSON和Base64。如果互操作性和易集成性更重要(并且大数据大小不是主要问题)那么您可以简单地将数据序列化为JSON字符串数组,每个字符串都是Base64编码的字节数组。这样,客户端只需要反序列化JSON数组,并对每个元素进行Base64解码。该解决方案还容易允许不同尺寸的子阵列。示例消息可能如下所示(作为JSON字符串):
["aGk=","aGk="]
最终,您可以使用many builtin encoding
packages来序列化此数据。没有单一的“正确”答案,因此您的实施选择应该由您的业务需求驱动。