首页 > 编程知识 正文

protobuf使用详解,子网掩码转换成二进制

时间:2023-05-03 21:36:58 阅读:34573 作者:947

在protobuf中,int32超过127的话数据会变大

环境:

客户端:unity c#服务端:skynet lua得出结论,在unity上,编码. utf8.getstring ()包含protobuf的byte[] )转换存在问题。 建议直接使用byte[],而不是将byte转换为string。 如果需要分割byte[],可以自己实现分割函数。

首先发现这个问题是因为操纵杆的操作不能同步。 我们的游戏是手机游戏,使用帧同步进行多人游戏。 测试时发现操纵杆,但拖动时,protobuf中的decode模块报告错误。

protobuf文件如下

消息框架2s { requiredstringusername=1; 请求用户用户=2; }消息用户{ required int 32 frameid=1; 请求int 32 leftjoyx=2; required int32 leftJoyY=3; 请求布尔雷夫特joyup=4; }消息框架2c { required int 32框架id=1; 请求框架2s user1=2; 请求框架2s user2=3; }服务端对客户端的protobuf数据进行解码,用以下代码发出log

[ :0100015 ]---------user1table 336007 F5 b 3d 471 d 441-leftjoyupfalse [ :01000015 ]-- frameid2[ 33:000007 --frameid2[ 33600015 ]-- user2table :0 x7 F5 b 3d 471 DC0[ :01000015 ]-- leftjoyx0[ :010000015 ]-- leftjoyupfff 为了避免浮点数的误差,使用了将浮点数乘以1000的固定点数。

所以,leftJoyX和leftJoyY的正常数值范围在0-1000之间。 但是,服务端确实收到了35525这个大数字。 可以确认基本上是客户端的问题。

然后发现将byte[]转换为string进行处理,以便客户端更容易处理,于是出现了问题。 我将进行测试,将包含protobuf的byte[]转换为string,然后将其重新返回。

byte[] byteStr; //protobuf数据string test str=system.text.encoding.utf8.getstring (bytes tr ); byte [ ] test bytearray=system.text.encoding.utf8.getbytes (test str ); 但是,当句柄作用时,byteStr.length与testByteArray.length不同。 我发现接下来的原因是Encoding.UTF8.GetString ()。 最后重写了unity端的部分模块,成功同步。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。