You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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生态)

  1. 添加Protobuf依赖到pubspec.yaml:
dependencies:
  protobuf: ^3.1.0
  1. 用protoc生成Dart代码:
protoc --dart_out=. asoiaf_warcouncil.proto
  1. 解码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示例

  1. 添加Protobuf依赖到build.gradle:
dependencies {
  implementation 'com.google.protobuf:protobuf-java:3.24.4'
}
  1. 用protoc生成Java代码:
protoc --java_out=. asoiaf_warcouncil.proto
  1. 解码代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:09:56