我打算重写已经在PHP-cli中工作过的游戏服务器。
由于我无法触摸客户端,因此必须按原样使用在线协议。这是一种纯二进制格式,每个数据包有多个字段。我使用PHP的pack / unpack命令的修改版本来进行此转换。数据包通常采用以下格式:
unpack('nitem/ncmdNum/NdataLen', $buf);
由cmdNum标识的几十个后续解压字符串中的任何一个。例如:
a32first_name/a32second_name/a32third_name/nfirst_itemid/nfirst_flags/nfirst_level/nunused/Nfirst_perm_flags/Ncvsize/a{$cvsize}contentsVector
nsuccess/ndummyfielda/a*xerror_msg/a*xtext/NcurrentVersion/NtimeLimit/a*xlimitValue/a*xlimit
[其中a{$cvsize}
表示由命名的值(通常是紧接在前的值)确定的固定长度的字符串,而a *表示以零结尾的可变长度的字符串。]
当前的PHP实现将其解压缩并调用一个处理命令'cmdNum'的函数,并传递一个包含解压缩数据的关联数组。依次调用发送代码,并使用类似的数组作为返回值。
虽然我确定可以将它们映射到结构,但从输入中读取(写入)并不仅仅是在结构上放置缓冲区。另外,在用于处理该消息的功能中,大多数数据包类型仅使用一次,因此要编码数十种结构,以及用于分别加载每个字段的代码,似乎是很多工作。
是否可以使用任何方法或程序包作为处理此类事情的基础?我搜索“ php unpack in go”似乎只是基于人们解压缩单个数值而返回结果,这显然很容易用编码/二进制替换!
解包/打包字符串是由其他一些PHP根据从客户端获取的规范自动生成的,因此,如果可以使用某些东西,我可以对其进行更改以相当容易地创建其他格式。通常我不会编写自己的函数来执行此类操作,但是对于Go来说是完全陌生的,这可能太过时了。