请教一个 go 与 Java 的编码交互问题

2019-10-09 18:06:03 +08:00
 gramyang
前端 android,后端 go,用 socket 进行连接。数据包的格式相同(长度-类型-数据),但是在拆包的时候仍然遇到了问题。
前端代码如下:
ByteBuffer bb = ByteBuffer.allocate(4 + body.length);
bb.order(ByteOrder.LITTLE_ENDIAN); //与 cellnet 匹配
bb.putShort((short)body.length);
bb.putShort((short)1024);
bb.put(body);
后端代码如下:
pkt := make([]byte, bodySize+msgIDSize+len(msgData))
binary.LittleEndian.PutUint16(pkt, uint16(msgIDSize+len(msgData)))
binary.LittleEndian.PutUint16(pkt[bodySize:], uint16(msgID))
copy(pkt[bodySize+msgIDSize:], msgData)
err := WriteFull(writer, pkt)

数据都是用 protobuf 序列化的,长度和类型是用的小端,长度分别为 2 字节。只是 java 和 go 的 api 不一样,java 用的是 ByteBuffer 的 putShort,而 go 用的是 binary.LittleEndian.PutUint16,我猜测拆包错误是这两个方法的底层编码不同。

求大佬指点!!
2352 次点击
所在节点    Java
1 条回复
gramyang
2019-10-09 18:26:58 +08:00
搞定了!! putshort 和 putuint16 的编码没有问题。是我这里一个小地方拆包出错了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/607548

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX