1 package edu.jiangxin.apktoolbox.convert.protobuf.unsupervised;
2
3 import com.google.protobuf.WireFormat;
4 import org.apache.commons.collections.CollectionUtils;
5 import org.json.JSONObject;
6
7 import java.util.List;
8
9 public class ProtobufUtils {
10 public static JSONObject getJsonObject(DecoderResult decoderResult) {
11 JSONObject jsonObject = new JSONObject();
12 jsonObject.put("byteRange", decoderResult.getByteRange());
13 jsonObject.put("fieldNumber", decoderResult.getFieldNumber());
14
15 List<DecoderResult> subResults = decoderResult.getSubResults();
16
17 if (CollectionUtils.isEmpty(subResults)) {
18 jsonObject.put("type", typeToString(decoderResult.getType(), false));
19 jsonObject.put("content", decoderResult.getContent());
20 } else {
21 jsonObject.put("type", typeToString(decoderResult.getType(), true));
22 for (DecoderResult subResult : decoderResult.getSubResults()) {
23 jsonObject.append("content", getJsonObject(subResult));
24 }
25 }
26 return jsonObject;
27 }
28
29 private static String typeToString(int type, boolean hasSubResults) {
30 return switch (type) {
31 case WireFormat.WIRETYPE_VARINT -> "varint";
32 case WireFormat.WIRETYPE_LENGTH_DELIMITED -> {
33 if (hasSubResults) {
34 yield "protobuf";
35 }
36 yield "string";
37 }
38 case WireFormat.WIRETYPE_FIXED32 -> "fixed32";
39 case WireFormat.WIRETYPE_FIXED64 -> "fixed64";
40 default -> "unknown";
41 };
42 }
43 }