Здравствуйте. Помогите пожалуйста разобраться, что конкретно делает нижеприведенный код с входными данными, и что получается на выходе? Предположительно он должен преобразовывать текст (и/или другие данные) в некую нечитаемую форму, но как он это делает - не могу понять :( Мне нужно понять именно алгоритм, чтобы реализовать обратную схему для получения исходных данных. Хоть я "программизмом" и занимаюсь уже достаточно давно, но в JAVA не разбираюсь, особенно в этом коде. Похоже, что тут все умышленно запутанно... Помогите, кто чем может
| Код | public final class o extends p { public o() { super(new byte[0]); }
public o(byte[] paramArrayOfByte) { super(paramArrayOfByte); }
private static String a(byte[] paramArrayOfByte) { StringBuilder localStringBuilder = new StringBuilder(); byte[] arrayOfByte = new byte[3]; int i = paramArrayOfByte.length / 3; int j = paramArrayOfByte.length % 3; for (int k = 0; ; k++) { if (k >= i) { if (j > 0) { System.arraycopy(paramArrayOfByte, k * 3, arrayOfByte, 0, j); localStringBuilder.append(a(arrayOfByte, j)); } return localStringBuilder.toString(); } System.arraycopy(paramArrayOfByte, k * 3, arrayOfByte, 0, 3); localStringBuilder.append(a(arrayOfByte, 3)); } }
private static char[] a(byte[] paramArrayOfByte, int paramInt) { int i = 61; int j = 0; Object localObject; if ((paramInt <= 0) || (paramInt > 3)) { localObject = null; return localObject; } short[] arrayOfShort = new short[paramInt]; char[] arrayOfChar = new char[4]; int k = 0; label33: int n; label81: int i2; if (k >= paramInt) { arrayOfChar[j] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(arrayOfShort[0] >> 2); int m = (0x3 & arrayOfShort[0]) << 4; if (paramInt <= 1) break label205; n = (0xF0 & arrayOfShort[1]) >> 4; arrayOfChar[1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(n | m); if (paramInt <= 1) break label211; i2 = (0xF & arrayOfShort[1]) << 2; if (paramInt > 2) j = (0xC0 & arrayOfShort[2]) >> 6; } label205: label211: for (int i1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(j | i2); ; i1 = i) { arrayOfChar[2] = i1; if (paramInt > 2) i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(0x3F & arrayOfShort[2]); arrayOfChar[3] = i; localObject = arrayOfChar; break; arrayOfShort[k] = paramArrayOfByte[k]; arrayOfShort[k] = (short)(0xFF & arrayOfShort[k]); k++; break label33; n = 0; break label81; } }
private static byte[] b(byte[] paramArrayOfByte) { for (int i = paramArrayOfByte.length; ; i--) if (paramArrayOfByte[(i - 1)] >= 0) { if ((i >= 2) && (i <= 4)) break; Object[] arrayOfObject = new Object[1]; arrayOfObject[0] = Integer.valueOf(i); throw new IllegalArgumentException(String.format("Illegal incoming data length (length = %1$d)", arrayOfObject)); } byte[] arrayOfByte = new byte[1 + (2 * (i / 4) + i % 4 / 3)]; arrayOfByte[0] = (byte)(paramArrayOfByte[0] << 2 | paramArrayOfByte[1] >> 4); if (paramArrayOfByte[2] >= 0) arrayOfByte[1] = (byte)((0xF & paramArrayOfByte[1]) << 4 | paramArrayOfByte[2] >> 2); if (paramArrayOfByte[3] >= 0) arrayOfByte[2] = (byte)((0x3 & paramArrayOfByte[2]) << 6 | paramArrayOfByte[3]); return arrayOfByte; }
public final XmlSerializer a(XmlSerializer paramXmlSerializer) { try { XmlSerializer localXmlSerializer = paramXmlSerializer.startTag("", "value").startTag("", "base64").text(a((byte[])this.a)).endTag("", "base64").endTag("", "value"); return localXmlSerializer; } catch (Exception localException) { throw new j(localException.getMessage()); } }
public final void a(String paramString) { int i = paramString.length(); byte[] arrayOfByte1; byte[] arrayOfByte2; int m; int n; if (paramString.charAt(i - 1) != '=') { int j = 3 * (i / 4); int k = i % 4; if ((k > 0) && (k != 1)) j += 1 + k / 3; arrayOfByte1 = new byte[j]; arrayOfByte2 = new byte[4]; Arrays.fill(arrayOfByte2, (byte)-1); m = 0; n = 0; } while (true) { if (m >= i) { if ((arrayOfByte2[0] >= 0) && (arrayOfByte2[1] >= 0)) { byte[] arrayOfByte3 = b(arrayOfByte2); System.arraycopy(arrayOfByte3, 0, arrayOfByte1, n * 3, arrayOfByte3.length); } this.a = arrayOfByte1; return; i--; break; } int i1 = paramString.charAt(m); if ((i1 >= 43) && (i1 <= 122)) { int i2 = "}$$$~stuvwxyz{|$$$$$$$?@ABCDEFGHIJKLMNOPQRSTUVWX$$$$$$YZ[\\]^_`abcdefghijklmnopqr".charAt(i1 + -43); if (i2 != 36) { arrayOfByte2[(m % 4)] = (byte)(i2 + -63); if (arrayOfByte2[3] >= 0) { System.arraycopy(b(arrayOfByte2), 0, arrayOfByte1, n * 3, 3); Arrays.fill(arrayOfByte2, (byte)-1); n++; } } } m++; } }
public final String toString() { return a((byte[])this.a); } }
|
|