1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| package com.example.kernel.util;
import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map;
public class BencodeUtils {
public static String encode(Object obj) { StringBuilder sb = new StringBuilder(); if (obj == null) { return ""; } switch (obj) { case Map<?, ?> map -> { sb.append("d"); for (Map.Entry<?, ?> entry : map.entrySet()) { sb.append(encode(entry.getKey())); sb.append(encode(entry.getValue())); } sb.append("e"); } case Integer ignored -> sb.append("i").append(obj).append("e"); case List<?> list -> { sb.append("l"); for (Object item : list) { sb.append(encode(item)); } sb.append("e"); } case String str -> sb.append(str.length()).append(':').append(str); case null, default -> throw new IllegalArgumentException("Unsupported type: " + obj.getClass()); } return sb.toString(); }
public static Object decode(byte[] s) { Object o = null; if (s == null || s.length == 0) { return o; } o = decodeObject(s, 0)[0]; return o; }
private static Object[] decodeObject(byte[] s, int index) { byte b = s[index]; if (b == 'i') { index++; int start = index; while (s[index] != 'e') { index++; } long value = Long.parseLong(new String(s, start, index - start)); index++; return new Object[]{value, index}; } else if ('0' <= b && b <= '9') { int start = index; while (s[index] != ':') { index++; } int length = Integer.parseInt(new String(s, start, index - start)); index++; String str = new String(s, index, length); index += length; return new Object[]{str, index}; } else if (b == 'd') { index++; Map<String, Object> map = new LinkedHashMap<>(); while (s[index] != 'e') { Object[] keyResult = decodeObject(s, index); String key = (String) keyResult[0]; index = (int) keyResult[1]; Object[] valueResult = decodeObject(s, index); Object value = valueResult[0]; index = (int) valueResult[1]; map.put(key, value); } index++; return new Object[]{map, index}; } else if (b == 'l') { index++; List<Object> list = new ArrayList<>(); while (s[index] != 'e') { Object[] result = decodeObject(s, index); list.add(result[0]); index = (int) result[1]; } index++; return new Object[]{list, index}; } else { index++; return decodeObject(s, index); } } }
|