747929791/majsoul_wrapper

liqi.py出现致命错误

Closed this issue · 3 comments

liqi.py 65-68:

B = base64.b64decode(dict_obj['data'])
action_proto_obj = getattr(pb, dict_obj['name']).FromString(B)
action_dict_obj = MessageToDict(action_proto_obj)
dict_obj['data'] = action_dict_obj

日志:
Wrong wire type in tag.
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\decoder.py", line 972, in _DecodeUnknownField
raise _DecodeError('Wrong wire type in tag.')
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\python_message.py", line 1178, in InternalParse
(data, new_pos) = decoder._DecodeUnknownField(
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\python_message.py", line 1127, in MergeFromString
if self._InternalParse(serialized, 0, length) != length:
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\site-packages\google\protobuf\internal\python_message.py", line 794, in FromString
message.MergeFromString(s)
File "C:\Users\12772\Desktop\MajsoulAI-master\majsoul_wrapper\liqi.py", line 67, in parse
action_dict_obj = MessageToDict(action_proto_obj)
File "C:\Users\12772\Desktop\MajsoulAI-master\main.py", line 124, in recvFromMajsoul
result = self.liqiProto.parse(flow_msg)
File "C:\Users\12772\Desktop\MajsoulAI-master\main.py", line 724, in MainLoop
aiWrapper.recvFromMajsoul()
File "C:\Users\12772\Desktop\MajsoulAI-master\main.py", line 744, in
MainLoop(level=level)
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\12772\AppData\Local\Programs\Python\Python38\Lib\runpy.py", line 194, in _run_module_as_main (Current frame)
return _run_code(code, main_globals, None,
google.protobuf.message.DecodeError: Wrong wire type in tag.

将上述代码第二行getattr()添加默认值""可以略过第一次报错(ActionMJStart)
{'step': 0, 'name': 'ActionMJStart', 'data': ''}
但是进入新的回合后data的值不为空时无法解码
{'step': 1, 'name': 'ActionNewRound', 'data': 'H/b75PhO8hTmKQEaJGBZ/3ppU1JxThiqHgATnE8BSWXnJL9c/dm9mqNxpsi8i/XO/bINs8/LBwbIiNxQdufk+vInt9iIo5ITP14LTCqWW0wPmL/jGxfTVc9U7tudwMQk8L2oMdTv5atY3WbxUiBvRY5o3kKJYjc0VyufGCUihW4bWF7H'}

修改后删除上述代码后两行会报另一个错:Unexpected end-group tag.

已经更换为最新版(v0.10.194.w)的最新liqi.json并进行proto→py转义

因为使用的是edge,protobuf需要3.14.0
使用protoc版本为3.14.0 使用protobufjs版本为v7.2.1(当前最新版) py3.8

proto模块解码分析wire_type为7

这个问题有解决吗?

这个问题有解决吗?

没有

Notify 的消息体经过了 encode,需要 decode

使用如下代码

keys = [0x84, 0x5e, 0x4e, 0x42, 0x39, 0xa2, 0x1f, 0x60, 0x1c]
def decode(data: bytes):
    data = bytearray(data)
    for i in range(len(data)):
        u = (23 ^ len(data)) + 5 * i + keys[i % len(keys)] & 255
        data[i] ^= u
    return bytes(data)

修改 65-68 行中的:

- getattr(pb, dict_obj['name']).FromString(B)
+ getattr(pb, dict_obj['name']).FromString(decode(B))