所以有一个我用过的名为"战争委员会"的应用程序,用来在ASOIAF迷你战争游戏中建立军队名单.它具有列表导出功能,可以导出Base64编码的二进制BLOB,如下所示:

EgVXYXRjaBgFICgoAFoHCIVSELagAVoDCJFSWgMIjFJaAwiRUmCm7gFgse4BYMPtAQ==

然后可以将其重新导入到另一部手机上的另一款应用程序中,等等.

当我解码这个和xxd的时候,我看到:

┌──(admuser㉿wkstation5)-[~]
└─$ xxd decoded2.txt 
00000000: 1209 6a6f 6b69 6e20 6361 7618 0620 2828  ..jokin cav.. ((
00000010: 005a 0708 ac51 10c8 9f01 5a07 08ec 5210  .Z...Q....Z...R.
00000020: c99f 015a 0308 f452 5a03 08ee 5260 90ef  ...Z...RZ...R`..
00000030: 0160 94ef 0160 92ef 01                   .`...`...

这里是另一个:

Eglqb2tpbiBjYXYYBiAoKABaBwisURDInwFaBwjsUhDJnwFaAwj0UloDCO5SYJDvAWCU7wFgku8B

┌──(admuser㉿wkstation5)-[~]
└─$ xxd decode.txt 
00000000: 1205 5761 7463 6818 0520 2828 005a 0708  ..Watch.. ((.Z..
00000010: 8552 10b6 a001 5a03 0891 525a 0308 8c52  .R....Z...RZ...R
00000020: 5a03 0891 5260 a6ee 0160 b1ee 0160 c3ed  Z...R`...`...`..
00000030: 01                                       .

在上面的观察名单中,应该有一个夜间值班的长矛单位,在战争委员会的数据中ID为10513.但似乎不能从数据中得出这一点.如果它实际上是使用id来存储单位的话,我倾向于这样认为.

我做了一些分析,应用程序将所有单位表示为整数.我注意到Watchjokin cav是我给他们的名单的名字.它似乎总是从12开始,0509表示后面的字符串的长度.

我还try 用dart和java解码,因为这是用flutter引擎做的,它使用dart并在android上编译成java.

import 'dart:convert';

void main() {
    // Your base64 encoded string
    String base64EncodedString = 'EgVXYXRjaBgFICgoAFoHCIVSELagAVoDCJFSWgMIjFJaAwiRUmCm7gFgse4BYMPtAQ==';

    // Decode the base64 string
    String serializedData = utf8.decode(base64.decode(base64EncodedString));

    try {
        // Try to parse the data as JSON
        dynamic deserializedObject = json.decode(serializedData);

        // Check if the deserialized object is a JSON-like map or an array of integers
        if (deserializedObject is Map) {
            print("Deserialized JSON-like object: $deserializedObject");
        } else if (deserializedObject is List) {
        //} else if (deserializedObject is List && deserializedObject.every((element) => element is int)) {
            print("Deserialized array of integers: $deserializedObject");
        } else {
            print("Deserialized data is of unknown type");
        }
    } catch (e) {
        print("Error during deserialization: $e");
    }
}

Java:

import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;
import java.util.Base64;

public class Base64Decoder {
    public static void main(String[] args) {
        String base64EncodedString = "EgVXYXRjaBgFICgoAFoHCIVSELagAVoDCJFSWgMIjFJaAwiRUmCm7gFgse4BYMPtAQ==";

        try {
            // Decode the base64 string into bytes
            byte[] data = Base64.getDecoder().decode(base64EncodedString);

            // Attempt to deserialize the object
            Object deserializedObject = deserialize(data);
            System.out.println("Deserialized object: " + deserializedObject);
        } catch (IOException | ClassNotFoundException e) {
            System.out.println("Deserialization failed: " + e.getMessage());
        }
    }

    private static Object deserialize(byte[] data) throws IOException, ClassNotFoundException {
        try (ByteArrayInputStream bis = new ByteArrayInputStream(data);
             ObjectInputStream in = new ObjectInputStream(bis)) {
            return in.readObject();
        }
    }
}

但运气不佳,两人都失败了.

我很好奇是否有人知道这是什么类型的编码/序列化,以及我如何破译它,这样我就可以弄清楚如何编程构建/导入列表到我正在开发的其他产品中.

下面是另一个示例:

EglWaWN0YXJpb24YCCAoKABaAwi4VFoHCLdUEMOiAVoDCLFUWgMItFRaAwiyVGDT8AFg1PABYNXwAQ==

└─$ xxd enc.txt 
00000000: 1209 5669 6374 6172 696f 6e18 0820 2828  ..Victarion.. ((
00000010: 005a 0308 b854 5a07 08b7 5410 c3a2 015a  .Z...TZ...T....Z
00000020: 0308 b154 5a03 08b4 545a 0308 b254 60d3  ...TZ...TZ...T`.
00000030: f001 60d4 f001 60d5 f001                 ..`...`...

推荐答案

这些看起来和你预期的一样吗?

2: {"Watch"}
3: 5
4: 40
5: 0
11: {`083f52103f3f01`}
11: {`083f52`}
11: {`083f52`}
11: {`083f52`}
12: 63
`3f01603f3f01603f3f010d0a`


2: {"jokin cav"}
3: 6
4: 40
5: 0
11: {`083f51103f3f01`}
11: {`083f52103f3f01`}
11: {`083f52`}
11: {`083f52`}
12: 63
`3f01603f3f01603f3f010d0a`



2: {"Victarion"}
3: 8
4: 40
5: 0
11: {
  1: 63
  10:EGROUP
}
11: {`083f54103f3f01`}
11: {
  1: 63
  10:EGROUP
}
11: {
  1: 63
  10:EGROUP
}
11: {
  1: 63
  10:EGROUP
}
12: 63
`3f01603f3f01603f3f010d0a`

这是你的数据被解释为协议缓冲区(由谷歌设计,因此对于DART应用程序来说可能是合理的?)

我是(在Windows上)这样做的

  1. 将Base64放入一个文件中
  2. 运行CertUtil(certutil -decode in.txt out.bin)
  3. 运行中的样机(cat out.bin|protoscope) Protcope是一款从here开始的围棋程序

这有帮助吗?

EDIT如果你使用这个app-https://protobuf-decoder.netlify.app/,它看起来输出更清晰--只需复制/粘贴你的Base64字符串.我不知道这些数字是不是你想要的,但名字部分在我看来绝对是对的.

Java相关问答推荐

在FML中删除关键帧动画

BiPredicate和如何使用它

如何在Android上获取来电信息

Java Stream,需要更新列表对象列表

JVM会优化这个数学运算吗?

AssertJ Java:多条件断言

Java流传输一个列表并创建单个对象

使用Jolt将字段转换为列表

Log4j与jdk21兼容吗?

Domino Designer 14中的保存代理添加了重影库

将PNG转换为位图自定义十六进制字符串

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

当构造函数创建一个新实例时,Java为什么需要&new";

Java组件项目中的JavaFX对话框国际化

从泛型枚举创建EnumMap

泛型与泛型问题的完美解决方案?

Eureka客户端无法使用用户/通行证注册到Eureka服务器

MapStruct记录到记录的映射不起作用

@此处不能应用可为null的批注

语句打印在错误的行(Java Token 问题)