1 package com.smartdevicelink.trace;
\r
3 // Borrowed from Dave Boll's infamous SmartDeviceLinkLinkRelay.java
\r
7 private static String m_base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
\r
9 public static String base64Encode(String str) {
\r
10 String b64String = "";
\r
12 byte[] strBytes = str.getBytes("US-ASCII");
\r
13 b64String = base64Encode(strBytes);
\r
14 } catch (Exception ex) {
\r
20 public static String base64Encode(byte bytesToEncode[]) {
\r
21 return base64Encode(bytesToEncode, 0, bytesToEncode.length);
\r
24 public static String base64Encode(byte bytesToEncode[], int offset, int length) {
\r
25 StringBuilder sb = new StringBuilder();
\r
30 for (idxin=offset;idxin < offset + length;idxin++) {
\r
31 switch ((idxin-offset) % 3) {
\r
33 b64idx = (bytesToEncode[idxin] >> 2) & 0x3f;
\r
36 b64idx = (bytesToEncode[idxin] >> 4) & 0x0f;
\r
37 b64idx |= ((bytesToEncode[idxin-1] << 4)& 0x30);
\r
40 b64idx = (bytesToEncode[idxin] >> 6) & 0x03;
\r
41 b64idx |= ((bytesToEncode[idxin-1] << 2)& 0x3c);
\r
42 sb.append(m_base64Chars.charAt(b64idx));
\r
43 b64idx = bytesToEncode[idxin] & 0x3f;
\r
46 sb.append(m_base64Chars.charAt(b64idx));
\r
49 switch ((idxin-offset) % 3) {
\r
53 b64idx = (bytesToEncode[idxin-1] << 4) & 0x30;
\r
54 sb.append(m_base64Chars.charAt(b64idx));
\r
58 b64idx = ((bytesToEncode[idxin-1] << 2)& 0x3c);
\r
59 sb.append(m_base64Chars.charAt(b64idx));
\r
64 return sb.toString();
\r
68 private byte[] base64Decode(String base64String) {
\r
69 byte[] outBytes = null;
\r
70 byte[] base64ASCIIString = null;
\r
71 final String ASCII_Encoding = "US-ASCII";
\r
73 // Convert b64 string to raw bytes
\r
75 base64ASCIIString = base64String.getBytes(ASCII_Encoding);
\r
76 } catch (Exception ex) {
\r
80 if (!m_decodeInitComplete) {
\r
81 m_decodeInitComplete = true;
\r
85 int numInChars = base64ASCIIString.length;
\r
87 if ((numInChars % 4) > 0) {
\r
91 int numOutBytes = base64ASCIIString.length / 4;
\r
93 int eqpos = base64String.indexOf("=");
\r
96 if (base64String.substring(eqpos).indexOf("==") >= 0) {
\r
100 outBytes = new byte[numOutBytes];
\r
102 byte b64idxbits = 0x00;
\r
103 int iidx = 0, oidx = 0;
\r
104 byte writeByte = 0x00;
\r
105 byte b64ASCIIChar = 0x00;
\r
106 for (iidx=0, oidx=0;iidx < numInChars;iidx++) {
\r
107 b64ASCIIChar = base64ASCIIString[iidx];
\r
108 if (b64ASCIIChar == 0x3d /*'='*/) {
\r
112 if (!isb64char(b64ASCIIChar)) {
\r
116 switch (iidx % 4) {
\r
120 b64idxbits = b64decode[base64ASCIIString[iidx-1]];
\r
121 writeByte = (byte)((b64idxbits << 2) | ((b64decode[b64ASCIIChar] >> 4) & 0x03));
\r
122 outBytes[oidx++] = writeByte;
\r
125 b64idxbits = b64decode[base64ASCIIString[iidx-1]];
\r
126 writeByte = (byte)(((b64idxbits << 4) & 0xf0) | ((b64decode[b64ASCIIChar] >> 2) & 0x0f));
\r
127 outBytes[oidx++] = writeByte;
\r
130 b64idxbits = b64decode[base64ASCIIString[iidx-1]];
\r
131 writeByte = (byte)(((b64idxbits << 6) & 0xc0) | ((b64decode[b64ASCIIChar]) & 0x3f));
\r
132 outBytes[oidx++] = writeByte;
\r
142 private static byte[] b64decode = new byte[256];
\r
143 // A-Z is 0x41-0x5a
\r
144 // a-z is 0x61-0x7a
\r
145 // 0-9 is 0x30-0x39
\r
149 private static boolean m_decodeInitComplete = false;
\r
151 private void initForDecode() {
\r
155 for (aidx=0x41, lidx=0;aidx <= 0x5a;aidx++, lidx++) {
\r
156 b64decode[aidx] = (byte)lidx;
\r
159 for (aidx=0x61;aidx <= 0x7a;aidx++, lidx++) {
\r
160 b64decode[aidx] = (byte)lidx;
\r
163 for (aidx=0x30;aidx <= 0x39;aidx++, lidx++) {
\r
164 b64decode[aidx] = (byte)lidx;
\r
167 b64decode[0x2b] = (byte)lidx++;
\r
169 b64decode[0x2f] = (byte)lidx++;
\r
172 private boolean isb64char(byte b) {
\r
173 // A-Z is 0x41-0x5a
\r
174 // a-z is 0x61-0x7a
\r
175 // 0-9 is 0x30-0x39
\r
178 return ( (b >= 0x41 && b <= 0x5a)
\r
179 || (b >= 0x61 && b <= 0x7a)
\r
180 || (b >= 0x30 && b <= 0x39)
\r