cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / platform / util-rt / src / com / intellij / util / Base64.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.util;
3
4 /**
5  * DEPRECATED, please use {@link java.util.Base64} instead
6  */
7 public final class Base64 {
8   private Base64() { }
9
10   public static String encode(byte[] bytes) {
11     return encode(bytes, 0, bytes.length);
12   }
13
14   public static String encode(byte[] bytes, int offset, int length) {
15     if (length == 0) return "";
16
17     StringBuilder builder = new StringBuilder();
18     for (int i = offset; i < length; i += 3) {
19       builder.append(encodeBlock(bytes, i));
20     }
21     return builder.toString();
22   }
23
24   private static char[] encodeBlock(byte[] bytes, int offset) {
25     int j = 0;
26     int s = bytes.length - offset - 1;
27     int l = Math.min(s, 2);
28     for (int i = 0; i <= l; i++) {
29       byte b = bytes[offset + i];
30       int n = b >= 0 ? ((int)(b)) : b + 256;
31       j += n << 8 * (2 - i);
32     }
33     char[] ac = new char[4];
34     for (int k = 0; k < 4; k++) {
35       int l1 = j >>> 6 * (3 - k) & 0x3f;
36       ac[k] = getChar(l1);
37     }
38     if (s < 1) ac[2] = '=';
39     if (s < 2) ac[3] = '=';
40     return ac;
41   }
42
43   private static char getChar(int i) {
44     if (i >= 0 && i <= 25) return (char)(65 + i);
45     if (i >= 26 && i <= 51) return (char)(97 + (i - 26));
46     if (i >= 52 && i <= 61) return (char)(48 + (i - 52));
47     if (i == 62) return '+';
48     return i != 63 ? '?' : '/';
49   }
50
51   public static byte[] decode(String s) {
52     if (s.length() == 0) return ArrayUtilRt.EMPTY_BYTE_ARRAY;
53
54     int i = 0;
55     for (int j = s.length() - 1; j > 0 && s.charAt(j) == '='; j--) {
56       i++;
57     }
58
59     int len = (s.length() * 6) / 8 - i;
60     byte[] raw = new byte[len];
61     int l = 0;
62     for (int i1 = 0; i1 < s.length(); i1 += 4) {
63       int n = s.length() - i1;
64       if (n == 1) throw new IllegalArgumentException("Invalid Base64 string");
65       int j1 = (getValue(s.charAt(i1)) << 18) +
66                (getValue(s.charAt(i1 + 1)) << 12) +
67                (n > 2 ? (getValue(s.charAt(i1 + 2)) << 6) : 0) +
68                (n > 3 ? (getValue(s.charAt(i1 + 3))) : 0);
69       for (int k = 0; k < 3 && l + k < raw.length; k++) {
70         raw[l + k] = (byte)(j1 >> 8 * (2 - k) & 0xff);
71       }
72       l += 3;
73     }
74     return raw;
75   }
76
77   private static int getValue(char c) {
78     if (c >= 'A' && c <= 'Z') return c - 65;
79     if (c >= 'a' && c <= 'z') return (c - 97) + 26;
80     if (c >= '0' && c <= '9') return (c - 48) + 52;
81     if (c == '+') return 62;
82     if (c == '/') return 63;
83     return c != '=' ? -1 : 0;
84   }
85 }