War Council应用导出二进制数据的序列化格式解析求助
解析War Council应用导出的ASOIAF战棋列表二进制数据
格式判断:Protocol Buffers(Protobuf)
你观察到的"开头12后跟字符串长度"是Protobuf的典型特征:
12是Protobuf的字段标签,由字段编号和类型组成:12 >> 3 = 2(字段编号为2),12 & 7 = 4(类型为长度前缀字符串),完全匹配你看到的列表名称字段结构。- 作为Flutter开发的应用,War Council大概率使用了Dart版的Protobuf库进行数据序列化,这也是直接用普通解析方法失败的原因。
解析步骤
1. 用原生工具验证格式
使用protoc的--decode_raw命令直接解析二进制数据,快速获取字段结构:
# 将Base64解码为二进制后解析 echo "你的Base64示例数据" | base64 -d | protoc --decode_raw
输出会显示所有字段的标签和对应值,比如包含10513的列表可能会输出:
2: "Watch" 3 { 1: 10513 }
这里就能直接看到单位ID(10513)位于字段3的重复子消息的字段1中。
2. 逆向生成Protobuf定义文件(.proto)
根据--decode_raw的输出,编写对应的.proto文件,示例如下:
syntax = "proto3"; // 战棋军队列表主消息 message ArmyList { string list_name = 2; // 对应标签12的列表名称字段 repeated Unit units = 3; // 重复的单位列表,对应标签18(3<<3 | 2,repeated子消息类型) } // 单位消息 message Unit { int32 unit_id = 1; // 单位ID,对应标签8(1<<3 | 0,varint类型) // 可根据解析结果添加其他字段,比如单位名称、数量等 }
3. 生成对应语言的解析代码并解码
Dart示例(适配Flutter生态)
- 添加Protobuf依赖到
pubspec.yaml:
dependencies: protobuf: ^3.1.0
- 用
protoc生成Dart代码:
protoc --dart_out=. asoiaf_warcouncil.proto
- 解码Base64数据的代码:
import 'dart:convert'; import 'asoiaf_warcouncil.pb.dart'; void parseWarCouncilList(String base64Data) { final binaryData = base64Decode(base64Data); final armyList = ArmyList.fromBuffer(binaryData); print("列表名称: ${armyList.listName}"); for (final unit in armyList.units) { print("单位ID: ${unit.unitId}"); // 这里就能提取到10513等单位ID } }
Java示例
- 添加Protobuf依赖到
build.gradle:
dependencies { implementation 'com.google.protobuf:protobuf-java:3.24.4' }
- 用
protoc生成Java代码:
protoc --java_out=. asoiaf_warcouncil.proto
- 解码代码:
import com.google.protobuf.InvalidProtocolBufferException; import java.util.Base64; public class WarCouncilParser { public static void parseList(String base64Data) throws InvalidProtocolBufferException { byte[] binaryData = Base64.getDecoder().decode(base64Data); ArmyList armyList = ArmyList.parseFrom(binaryData); System.out.println("列表名称: " + armyList.getListName()); for (Unit unit : armyList.getUnitsList()) { System.out.println("单位ID: " + unit.getUnitId()); } } }
注意事项
- 如果
protoc命令未安装,可从Protobuf官方仓库下载对应平台的二进制包。 - 多组示例数据对比能更快确定所有字段的含义,比如不同列表中变化的字段大概率是单位ID、数量等核心数据。
内容的提问来源于stack exchange,提问作者ChrisMan
相关产品推荐
相关产品推荐

