OSDN Git Service

キーワード検索ダイアログ等にESCキーでのキャンセル動作を追加
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / b64.java
1 package tainavi;\r
2 \r
3 import java.util.ArrayList;\r
4 \r
5 \r
6 \r
7 public class b64 {\r
8         \r
9         private static final String list = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\r
10 \r
11         public static String enc(byte[] src) {\r
12                 String out = "";\r
13                 \r
14                 if (src == null) {\r
15                         return null;\r
16                 }\r
17                 \r
18                 int n = src.length;\r
19                 byte[] b = new byte[n+1];\r
20                 b[n] = 0x00;\r
21                 System.arraycopy(src, 0, b, 0, n);\r
22                 \r
23                 int x;\r
24                 int y;\r
25                 int j;\r
26                 byte c = 0;\r
27                 for (int i=0; i<n*8; i+=6) {\r
28                         j = (i-i%8)/8;\r
29                         switch (i%8) {\r
30                         case 0:\r
31                                 x = (int)b[j];\r
32                                 x &= 0x000000fc;\r
33                                 x >>= 2;\r
34                                 c = (byte)x;\r
35                                 break;\r
36                         case 1:\r
37                                 x = (int)b[j];\r
38                                 x &= 0x0000007e;\r
39                                 x >>= 1;\r
40                                 c = (byte)x;\r
41                                 break;\r
42                         case 2:\r
43                                 x = (int)b[j];\r
44                                 x &= 0x0000003f;\r
45                                 c = (byte)x;\r
46                                 break;\r
47                         case 3:\r
48                                 x = (int)b[j];\r
49                                 x &= 0x0000001f;\r
50                                 x <<= 1;\r
51                                 y = (int)b[j+1];\r
52                                 y &= 0x00000080;\r
53                                 y >>= 7;\r
54                                 c = (byte)(x|y);\r
55                                 break;\r
56                         case 4:\r
57                                 x = (int)b[j];\r
58                                 x &= 0x0000000f;\r
59                                 x <<= 2;\r
60                                 y = (int)b[j+1];\r
61                                 y &= 0x000000C0;\r
62                                 y >>= 6;\r
63                                 c = (byte)(x|y);\r
64                                 break;\r
65                         case 5:\r
66                                 x = (int)b[j];\r
67                                 x &= 0x00000007;\r
68                                 x <<= 3;\r
69                                 y = (int)b[j+1];\r
70                                 y &= 0x000000E0;\r
71                                 y >>= 5;\r
72                                 c = (byte)(x|y);\r
73                                 break;\r
74                         case 6:\r
75                                 x = (int)b[j];\r
76                                 x &= 0x00000003;\r
77                                 x <<= 4;\r
78                                 y = (int)b[j+1];\r
79                                 y &= 0x000000F0;\r
80                                 y >>= 4;\r
81                                 c = (byte)(x|y);\r
82                                 break;\r
83                         case 7:\r
84                                 x = (int)b[j];\r
85                                 x &= 0x00000001;\r
86                                 x <<= 5;\r
87                                 y = (int)b[j+1];\r
88                                 y &= 0x000000F8;\r
89                                 y >>= 3;\r
90                                 c = (byte)(x|y);\r
91                                 break;\r
92                         }\r
93                         out += list.substring((int)c,(int)c+1);\r
94                 }\r
95                 for (int i=out.length(); i%4 != 0; i++) {\r
96                         out += "=";\r
97                 }\r
98                 return(out);\r
99         }\r
100                 \r
101         public static byte[] dec(String src){\r
102                 \r
103                 if (src == null) {\r
104                         return null;\r
105                 }\r
106                 \r
107                 ArrayList<Byte> ba = new ArrayList<Byte>();\r
108                 \r
109                 int x;\r
110                 int y;\r
111                 int m = 0;\r
112                 byte c = 0;\r
113                 int n = src.length();\r
114                 for (int i=0; i<n; i++) {\r
115                         //\r
116                         int b = list.indexOf(src.charAt(i));\r
117                         if (b == -1) {\r
118                                 break;\r
119                         }\r
120                         \r
121                         //\r
122                         //int j = i / 4;\r
123                         switch (m = i%4) {\r
124                         case 0:\r
125                                 x = b;\r
126                                 x &= 0x0000003f;\r
127                                 x <<= 2;\r
128                                 c = (byte)x;\r
129                                 ba.add(c);\r
130                                 break;\r
131                         case 1:\r
132                                 x = b;\r
133                                 x &= 0x00000030;\r
134                                 x >>= 4;\r
135                                 c = ba.remove(ba.size()-1);\r
136                                 c |= (byte)x;\r
137                                 ba.add(c);\r
138                                 //\r
139                                 y = b;\r
140                                 y &= 0x0000000f;\r
141                                 y <<= 4;\r
142                                 c = (byte)y;\r
143                                 ba.add(c);\r
144                                 break;\r
145                         case 2:\r
146                                 x = b;\r
147                                 x &= 0x0000003C;\r
148                                 x >>= 2;\r
149                                 c = ba.remove(ba.size()-1);\r
150                                 c |= (byte)x;\r
151                                 ba.add(c);\r
152                                 //\r
153                                 y = b;\r
154                                 y &= 0x00000003;\r
155                                 y <<= 6;\r
156                                 c = (byte)y;\r
157                                 ba.add(c);\r
158                                 break;\r
159                         case 3:\r
160                                 x = b;\r
161                                 x &= 0x0000003f;\r
162                                 c = ba.remove(ba.size()-1);\r
163                                 c |= (byte)x;\r
164                                 ba.add(c);\r
165                                 break;\r
166                         }\r
167                 }\r
168                 \r
169                 // 端数切捨て\r
170                 if (ba.size() > 0 && m != 3) {\r
171                         ba.remove(ba.size()-1);\r
172                 }\r
173                 \r
174                 // リスト→配列\r
175                 byte[] bb = new byte[ba.size()];\r
176                 int i = 0;\r
177                 for (Byte b : ba) {\r
178                         bb[i++] = b;\r
179                 }\r
180                 \r
181                 return bb;\r
182         }\r
183 }\r