protobuf 中int32超过127后数据变超大

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这边的部分模块,才正常同步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值