import com.lanremote.watch.B64; import com.lanremote.watch.Json; import java.util.Arrays; import java.util.Map; /** 定位 Base64 在哪些长度下往返出错。 */ public class B64Diag { public static void main(String[] args) { int failures = 0; int firstBad = -1; // 1. 穷举 0..2000,找出所有长度相关的缺陷 for (int len = 0; len <= 2000; len++) { byte[] data = pattern(len); byte[] back = B64.decode(B64.encode(data)); if (!Arrays.equals(data, back)) { failures++; if (firstBad < 0) { firstBad = len; } if (failures <= 5) { System.out.println(" 长度 " + len + " 往返不一致 encoded=" + B64.encode(data).length() + " decoded=" + back.length); report(data, back); } } } System.out.println("1) 0..2000 穷举:失败 " + failures + " 个长度,首个 " + firstBad); // 2. 实际用到的分块长度 int[] sizes = {256 * 1024, 300 * 1024 + 7 - 256 * 1024, 300 * 1024 + 7, 64 * 1024, 202, 1024, 45063, 262144}; for (int size : sizes) { byte[] data = pattern(size); byte[] back = B64.decode(B64.encode(data)); System.out.println("2) 长度 " + size + " -> " + (Arrays.equals(data, back) ? "OK" : "不一致")); if (!Arrays.equals(data, back)) { report(data, back); } } // 3. 走一遍真实的 JSON 内嵌流程(模拟协议报文) byte[] data = pattern(262144); Map msg = Json.obj("cmd", "file_push", "name", "x.bin", "seq", 0, "last", false, "data", B64.encode(data)); String wire = Json.write(msg); Map parsed = Json.parseObject(wire); byte[] back = B64.decode(Json.str(parsed, "data", "")); System.out.println("3) 经 JSON 编解码后: " + (Arrays.equals(data, back) ? "OK" : "不一致")); if (!Arrays.equals(data, back)) { report(data, back); } System.exit(failures == 0 ? 0 : 1); } private static byte[] pattern(int len) { byte[] data = new byte[len]; for (int i = 0; i < len; i++) { data[i] = (byte) ((i * 31 + 7) & 0xFF); } return data; } private static void report(byte[] expected, byte[] actual) { int limit = Math.min(expected.length, actual.length); for (int i = 0; i < limit; i++) { if (expected[i] != actual[i]) { System.out.println(" 首个差异 @ " + i + " 期望=" + (expected[i] & 0xFF) + " 实际=" + (actual[i] & 0xFF)); return; } } System.out.println(" 前缀相同,但长度不同: 期望 " + expected.length + " 实际 " + actual.length); } }