protobuf 中int32超过127后数据变超大
环境:
- 客户端 :unity c#
- 服务端:skynet lua
先说结论:unity中Encoding.UTF8.GetString() 对包含protobuf的byte[]转换出现了问题。建议直接使用byte[],而不要将byte转换为string,如果需要分割byte[],可以自己实现个分割函数。
首先发现这个问题是因为摇杆操作无法同步,我们的游戏是一个手机游戏,使用帧同步进行多人游戏,测试时候发现摇杆一但拖动,protobuf的decode模块就会报错。
protobuf文件如下
message FrameC2S{
required string username =1;
required User user=2;
}
message User{
required int32 frameId = 1;
required int32 leftJoyX = 2;
required int32 leftJoyY = 3;
required bool LeftJoyUp=4;
}
message FrameS2C{
required int32 frameId = 1;
required FrameC2S user1 = 2;
required FrameC2S user2 = 3;
}
服务端将客户端的protobuf数据decode并且打出log,代码如下
[:01000015] ----------------------------
[:01000015] --- user1 table: 0x7f5b3d471d40
[:01000015] -- leftJoyX 35525
[:01000015] -- LeftJoyUp false
[:01000015] -- frameId 2
[:01000015] -- leftJoyY 35525
[:01000015] --- frameId 2
[:01000015] --- user2 table: 0x7f5b3d471dc0
[:01000015] -- leftJoyX 0
[:01000015] -- LeftJoyUp false
[:01000015] -- frameId 2
[:01000015] -- leftJoyY 0
其中leftJoyX和leftJoyY代表摇杆偏移,为了避免浮点数误差,我们使用了定点数,将浮点数乘1000.
所以leftJoyX和leftJoyY的正常数值范围在0-1000之中。但是服务端收到的确是35525这样很大数字。基本可以确定是客户端的问题。
然后发现客户端为了处理方便将byte[]转为string进行处理,这里出现了问题。我做个测试,将一个包含protobuf的byte[]转换为string,再将其转回。
byte[] byteStr; //protobuf数据
string testStr = System.Text.Encoding.UTF8.GetString(byteStr);
byte[] testByteArray = System.Text.Encoding.UTF8.GetBytes(testStr);
一但手柄移动,byteStr.length就与testByteArray.length不同了。后面发现是Encoding.UTF8.GetString() 导致的。最后我重写了unity这边的部分模块,才正常同步。